【发布时间】:2015-04-18 17:46:30
【问题描述】:
我有一个相当大的数据框,其中一个因子有很多级别(超过 4,000 个)。我在同一个数据框中有另一列用作参考,只要此参考列为 NA,我想查找的是级别的子集。
我使用的第一步是subsetrows <- which(is.na(mydata$reference)),但之后我就卡住了。我想要levels(mydata[subsetrows,mydata$factor]) 之类的东西,但不幸的是,此命令向我显示所有 级别,而不仅仅是subsetrows 中存在的级别。我想我可以只在我的子集行的数据框之外创建一个新向量,然后删除任何未使用的级别,但是有没有更简单/更清洁的方法可以做到这一点,可能不需要将我的数据复制到数据框之外?
作为我想要返回的示例,如果我的数据框具有从 A 到 Z 的因子级别,但在我的子集中仅出现 P、R 和 Y,我想要返回级别 P、R 和 Y 的内容。
【问题讨论】:
-
你能试试
levels(mydata$factor)[mydata$factor[subsetrows]]吗? -
好吧,使用你之前对
unique的想法,结果证明这给了我正确的级别:unique(as.character(mydata$factor[subsetrows])) -
其实
as.character.factor是levels(x)[x]的总结 -
@thelatemail,我不这么认为:子集
mydata$factor[subsetrows]返回因子的子集,即用作存储在级别中的字符的快捷方式的数字索引,保证在长度范围内levels(x)并保证匹配适当的级别。事实上,正如我之前提到的,as.character(mydata$factor[subsetrows])调用了as.character.factor,其定义为function(x) levels(x)[x]。因此,我的解决方案和 Alium 提出的解决方案(实际上我更喜欢它,因为它的紧凑性)本质上是一回事