R - 仅显示数据框子集中使用的级别
Posted
技术标签:
【中文标题】R - 仅显示数据框子集中使用的级别【英文标题】:R - show only levels used in a subset of data frame 【发布时间】: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 的内容。
【问题讨论】:
也许这可以帮助***.com/questions/1195826/… 你能试试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 提出的解决方案(实际上我更喜欢它,因为它的紧凑性)本质上是一回事
【参考方案1】:
您当然可以使用base
函数完成此操作。但我个人的偏好是将dplyr
与这样的链式操作一起使用:
library(dplyr)
d %>%
filter(is.na(ref)) %>%
select(field) %>%
distinct()
数据
d <- data.frame(
field = c("A", "B", "C", "A", "B", "C"),
ref = c(NA, "a", "b", NA, "c", NA)
)
【讨论】:
%>% 运算符是做什么的? 这是来自magrittr 的正向管道操作员。基本上x %>% f()
等价于f(x)
。
所以...这相当于将d$ref
放入filter
行,然后将结果放入select
行,然后将结果放入@ 987654331@线?【参考方案2】:
我修改了 Marat 在 cmets 中的一个建议,以使用似乎返回正确级别的函数 unique
。
解决方案:
subsetrows <- which(is.na(mydata$reference))
unique(as.character(mydata$factor[subsetrows]))
虽然我喜欢学习新的包和功能,但这个解决方案在这一点上似乎更好,因为它更紧凑,更容易让我理解,如果我需要在未来某个遥远的地方重新访问这段代码。
【讨论】:
以上是关于R - 仅显示数据框子集中使用的级别的主要内容,如果未能解决你的问题,请参考以下文章
如何删除 R 中仅出现在一个变量级别且从不出现第二个变量级别的所有参与者?