代码之家  ›  专栏  ›  技术社区  ›  CoolBuffScienceDude

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

  •  3
  • CoolBuffScienceDude  · 技术社区  · 11 年前

    在试图绘制我的数据时,我发现了一个意外的行为,这导致了我的组被不正确地重新排列和标签错误。

    简而言之,将因子对象存储到数据帧的几列中会导致它被强制为字符,而不是因子。这似乎与 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 回复  |  直到 9 年前
        1
  •  3
  •   MrFlick    11 年前

    所以问题在于 [<-.data.frame 函数,它是在执行赋值时运行的

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

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

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

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

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

    因此,因子如此害怕矩阵有点烦人,但一旦你学会了掌握它们,它们真的是R的强大功能。不要气馁!