带有因子变量的as.numeric()的奇怪行为-为提供的变量提供完全不同的数字
我有一个数据集,我试图将一个因子转换成一个数值变量,第一次运行时它似乎工作正常,但现在我更改了向量内容。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
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