首页 文章

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

提问于
浏览
3

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

简而言之,将因子对象存储到数据帧的多个列会导致它被强制转换为字符,而不是因素 . 这似乎与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 回答

  • 3

    所以问题出现在 [<-.data.frame 函数中,当你执行类似的赋值时,它会运行

    frame[,c("y", "z")] = x
    

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

    matrix(x, nrow=3, ncol=2)
    

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

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

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

相关问题