【问题标题】:Strange behaviour of as.numeric() with factor variable - gives completely different numbers to those supplied [duplicate]具有因子变量的 as.numeric() 的奇怪行为 - 提供的数字与提供的数字完全不同 [重复]
【发布时间】:2020-01-24 14:53:06
【问题描述】:

我有一个数据集,我试图将一个因子转换为一个数值变量,我第一次运行它时它似乎工作正常,但现在我更改了向量内容 as.numeric() 函数返回不同(可能是以前的)值,而不是现在向量中的值,尽管这些值似乎没有存储在任何地方。但是,如果我先转换为字符,它就可以正常工作。我使用的代码是:

rm(reprex) # ensure does not exist from previously
reprex <- data.frame(rbind(c("BT",8),c("BL", 1), c("TS",1), c("SA", 7), c("S", 5), c("LS",5), c("M",3), c("CV",3), c("CF",3), c("PE",3)))

names(reprex) <-c("Post Area", "Count")
reprex$Countnum <- as.numeric(reprex$Count) # should be same as Count
reprex$Countnum_char <- as.numeric(as.character(reprex$Count)) # is same as Count

head(reprex)

给予:

  Post Area Count Countnum Countnum_char
1        BT     8        5             8
2        BL     1        1             1
3        TS     1        1             1
4        SA     7        4             7
5         S     5        3             5
6        LS     5        3             5

这是为什么?如果我在转换为数字之前将其转换为字符似乎可以避免它,但我很困惑为什么会发生这种情况以及奇怪映射的(我怀疑来自数据框的先前版本)因子级别正在存储,以便在我删除对象后它们仍然存在。

【问题讨论】:

    标签: r types numeric


    【解决方案1】:

    这个问题涉及R 如何理解您的流程。 Count = 1 是最小的数字,所以它变成了Countnum = 1Count = 3 是第二大数字,因此因子水平为 2,这也意味着 Countnum = 2,依此类推。实际上,您的第一个 as.numeric 所做的是采用因子水平并将因子水平转换为数字。 Countnum_char 将字符值(例如,Count = 8factor level = 5Count = 5factor level = 3)作为其值并将值转换为数字,而不是因子级别。

    【讨论】:

    • 谢谢!我很困惑,因为碰巧之前的字符值和之前的因子级别是相同的,所以直到内容改变我才注意到这不起作用!
    【解决方案2】:

    看看这里以了解为什么会发生这种情况:https://www.dummies.com/programming/r/how-to-convert-a-factor-in-r/

    Dummies 网站在 R 上有很多很好的免费资源。

    &gt; numbers &lt;- factor(c(9, 8, 10, 8, 9))

    如果你在上面的代码 sn-p 上运行str(),你会得到这个输出:

    > str(numbers) Factor w/ 3 levels "8","9","10": 2 1 3 1 2

    R 将值存储为 c(2, 1, 3, 1, 2) 与相关级别 c(“8”, “9”, “10”)

    将数字转换为字符向量时,您会收到预期的输出:

    > as.character(numbers) [1] "9" "8" "10" "8" "9"

    但是,当您使用 as.numeric() 时,您将获得向量的内部级别表示的输出,而不是原始值。

    做你该做的

    > as.numeric(as.character(numbers)) [1] 9 8 10 8 9

    这正是您解决此问题的方法!这是 R 在做你正在做的事情时的正常行为;你在这里没有犯任何我能看到的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      相关资源
      最近更新 更多