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.factorlevels(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 %&gt;% 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 中仅出现在一个变量级别且从不出现第二个变量级别的所有参与者?

显示 R 中图例的选择级别

Symfony2/Monolog:日志级别 - 仅显示 app.INFO?

Google Maps v3 - 限制可视区域和缩放级别

通过仅知道级别数来识别一维数据的级别

Linux 服务控制与运行级别