强制引入的数值NA的因素

时间:2018-12-10 16:12:47

标签: r dataframe

我知道这是一个已经解决了数百次的问题,但是我遇到了将因子转换为数字的问题。

以下是一些我用来生成数据框并将“方向”因子转换为数字的基本代码:

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,我不明白自己做错了什么。我想确保我了解将因子转换为数字时发生了什么,但这对我来说仅是另一个问题。

如果有人能告诉我我做错了什么,或者我在这里错过了什么,我将不胜感激。

最好, 柯蒂斯

3 个答案:

答案 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的新列。