如何在申请家庭内分配?

Mat*_*ert 5 r apply dataframe

我有data.frame包含几个因素,我想重命名所有这些因素的因子水平.例如:

mydf <- data.frame(col1 = as.factor(c("A","A",NA,NA)),col2 = as.factor(c("A",NA,NA,"A")))
mydf <- as.data.frame(lapply(mydf,addNA))
Run Code Online (Sandbox Code Playgroud)

请注意,现实生活中的示例不仅仅包含两列.因此,我想使用apply将其他级别名称分配给所有这些列,就像在:

levels(mydf$col1) <- c("1","0") 
Run Code Online (Sandbox Code Playgroud)

我试过以下但是没有用......

 apply(mydf,1,function(x) levels(x) <- c("1","0"))
Run Code Online (Sandbox Code Playgroud)

我并不感到惊讶它没有用,但我现在没有更好的想法.我可以使用with吗?

编辑:我意识到我在这里过分简化了一些错误.我曾经addNA说过这样一个事实,那就是NA不应该再作为NAs处理了.因此,我也想重新标记它们.这不适用于Andrie的建议并返回以下错误消息:

 labels = c("1",  : invalid labels; length 2 should be 1 or 1  
Run Code Online (Sandbox Code Playgroud)

请注意,我更新了我的示例df.

Mat*_*wle 8

您可以使用setattr()bit或参考来更改级别data.table.这样可以避免复制整个数据集,因为你说你有很多列......

require(bit)          # Either package
require(data.table)   #
setattr(mydf[[1]],"levels",c("1","0"))
setattr(mydf[[2]],"levels",c("1","0"))
Run Code Online (Sandbox Code Playgroud)

这可以在一个for非常快的简单循环中完成.您有责任确保使用相同长度的向量替换水平向量,否则该因子可能不再有效.并且,您必须使用此方法替换整个级别向量.有一种内部方法data.table可以通过引用替换特定的级别名称,但可能不需要那么远.

  • @Joshua`tracemem(mydf)`首先,看看4个副本(_whole_对象).保持`tracemem`然后尝试`setattr()`:根本没有副本,没有.然后给`mydf` 10亿行,当`setattr()`工作正常(并且很快)时,用'内存不足'来观察其他行. (2认同)