带有因子变量的as.numeric()的奇怪行为-为提供的变量提供完全不同的数字

带有因子变量的as.numeric()的奇怪行为-为提供的变量提供完全不同的数字,r,types,numeric,R,Types,Numeric,我有一个数据集,我试图将一个因子转换成一个数值变量,第一次运行时它似乎工作正常,但现在我更改了向量内容。numeric()函数返回的是不同的(可能是以前的)值,而不是向量中现在的值,尽管事实上,这些似乎并没有存储在任何地方。不过,如果我先转换为一个字符,效果会很好。我使用的代码是: rm(reprex) # ensure does not exist from previously reprex <- data.frame(rbind(c("BT",8),c("BL", 1), c("TS

我有一个数据集,我试图将一个因子转换成一个数值变量,第一次运行时它似乎工作正常,但现在我更改了向量内容。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)

为什么会这样?如果我在转换为数字之前先将其转换为字符,这样我就可以避免它,这似乎是可行的,但我不明白为什么会发生这种情况,以及奇怪的映射在哪里(我怀疑是从以前版本的dataframe)正在存储因子级别,以便在我删除对象后它们仍然存在。

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

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

看看这里,了解一下发生这种情况的原因:

Dummies
网站上有很多关于R的免费资源

>数字str(数字)
系数w/3级“8”、“9”、“10”:2 1 2

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

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

>作为.字符(数字)
[1] “9”“8”“10”“8”“9”

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

做你做过的事

>作为.numeric(作为.character(数字))
[1] 9 8 10 8 9


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

看看这里,了解一下发生这种情况的原因:

Dummies
网站上有很多关于R的免费资源

>数字str(数字)
系数w/3级“8”、“9”、“10”:2 1 2

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

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

>作为.字符(数字)
[1] “9”“8”“10”“8”“9”

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

做你做过的事

>作为.numeric(作为.character(数字))
[1] 9 8 10 8 9


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

谢谢!我很困惑,因为碰巧以前的字符值和以前的因子级别是相同的,所以我没有注意到这在内容更改之前不起作用!谢谢我很困惑,因为碰巧以前的字符值和以前的因子级别是相同的,所以我没有注意到这在内容更改之前不起作用!
  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