如何在申请家庭内分配?

时间:2012-02-27 11:09:48

标签: r dataframe apply

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

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))

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

中一样
levels(mydf$col1) <- c("1","0") 

我尝试了以下但是没有用......

 apply(mydf,1,function(x) levels(x) <- c("1","0"))

我并不感到惊讶它不起作用,但我现在没有更好的想法。我应该使用with吗?

编辑:我意识到我在这里过分简化了一些错误。我使用addNA来解释这样一个事实:不再需要将NAs作为NAs处理。因此,我也想重新标记它们。 这不适用于Andrie的建议并返回以下错误消息:

 labels = c("1",  : invalid labels; length 2 should be 1 or 1  

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

1 个答案:

答案 0 :(得分:8)

您可以使用bitdata.table包中的setattr()来引用更改级别。这样可以避免复制整个数据集,因为你说你有很多列......

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

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