用因子对象替换数据框的列而不是插入字符数据?

时间:2014-08-11 23:17:57

标签: r class dataframe r-factor

在尝试绘制我的数据时,我发现了一个意外的行为,导致我的群体被错误地重新排列和贴错标签。

简而言之,将因子对象存储到数据帧的多个列会导致它被强制转换为字符而不是因子。这似乎与previously-answered question here有关,但我仍然不明白为什么会这样。

# x is a factor
(x = factor(c("red", "blue", "green")))
class(x)

# make a data frame
frame = data.frame("y"=1:3, "z"=1:3)

# replacing one column at a time yields a factor
frame[,"y"] = x; class(frame[,"y"])
frame[,"z"] = x; class(frame[,"z"])

# however, replacing >1 column at a time yields a character
frame[,c("y", "z")] = x
class(frame$y); class(frame$z)

R中的因素往往会让我感到胃灼热,不知何故!排序,数值和字符级别的组合,一般的繁琐...无论如何,我确定这是我不了解的数据框的特定属性。感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

所以问题出在[<-.data.frame函数中,这就是当你执行像

这样的赋值时运行的函数
 frame[,c("y", "z")] = x

问题在于,当您指定多个列时,如果新值不是列表,它会将其转换为具有正确行数和列数的矩阵,然后将其拆分为列表。因此,因素的问题是您无法将它们存储在矩阵中。如果你试试

,你可以看到这个
matrix(x, nrow=3, ncol=2)

同样,这种转换正在发生,因为您指定了多个列,并且新值不是列表。因此,解决这个问题的一种方法是将列表作为新值。

frame[,c("y", "z")] <- list(x)

所以,有些烦人的因素是如此害怕矩阵,但是一旦你学会掌握它们,它们确实是R的强大功能。不要气馁!

相关问题