我知道这是一个已经解决了数百次的问题,但是我遇到了将因子转换为数字的问题。
以下是一些我用来生成数据框并将“方向”因子转换为数字的基本代码:
size <- c(1,2,3,2)
directions <- factor(c("North", "East", "South", "South"))
df <- data.frame(size,directions)
fac_indx <- sapply(df, is.factor)
df[fac_indx] <- lapply(df[fac_indx], function(x) as.numeric(as.character(x)))
我仍然收到NA,我不明白自己做错了什么。我想确保我了解将因子转换为数字时发生了什么,但这对我来说仅是另一个问题。
如果有人能告诉我我做错了什么,或者我在这里错过了什么,我将不胜感激。
最好, 柯蒂斯
答案 0 :(得分:2)
您基本上遇到了相反的问题,而文档警告了!
在这种情况下,as.numeric(x)
应该可以正常工作。
这个问题更常见的是,有人问“嘿,为什么这段代码不起作用?”
df <- data.frame(nums=c(6,4,8,2,5,'unknown'))
as.numeric(df$nums)
# or
myfactor <- factor(11:20)
as.numeric(myfactor[3])
在这种情况下,我们必须解释一个因素只是可能值的列表,而as.numeric仅返回基础表示形式。并不是说as.numeric
是错误,仅仅是因为有一个因素,它所做的事情是大多数人不期望的。
在这种情况下,as.numeric(as.character(myfactor[3]))
返回13,就像(11:20)[3]
要做的唯一需要注意的是您的实际水平。默认情况下,它们是按字母顺序排序的,这可能不是您想要的。分配值时,最简单的解决方法是提供一个levels参数:
directions <- factor(c("North", "East", "South", "South"), levels=
c('North', 'East', 'South', 'West'))
答案 1 :(得分:0)
您似乎想将方向转换为数值,对不对?如果需要的话,可以定义另一个包含每个方向的数值的变量,这样:
df$directions.num <- ifelse(df$directions=="North", 1,
ifelse(df$directions=="East", 2,
ifelse(df$directions=="South", 3, 4)))
df
size directions directions.num
1 1 North 1
2 2 East 2
3 3 South 3
4 2 South 3
答案 2 :(得分:0)
还可以使用switch
进行表查找。
sapply(df$directions, function(d)
switch(as.character(d),
"East" = 1,
"North" = 2,
"South" = 3,
"West" = 4
)
)
#[1] 2 1 3 3
然后将上述指令的结果分配给data.frame的新列。