R - 仅显示数据框子集中使用的级别

R - show only levels used in a subset of data frame

我有一个相当大的数据框,其中的一个因子有很多级别(超过 4,000)。我在同一数据框中有另一列用作参考,每当此参考列为 NA 时,我想查找的是水平的子集。

我使用的第一步是 subsetrows <- which(is.na(mydata$reference)),但之后我就卡住了。我想要 levels(mydata[subsetrows,mydata$factor]) 之类的东西,但不幸的是,这个命令向我显示了 所有 级别,而不仅仅是 subsetrows 中存在的级别。我想我可以在只有我的子集行的数据框之外创建一个新向量,然后删除任何未使用的级别,但是有没有 easier/cleaner 方法可以做到这一点,可能不需要将我的数据复制到数据框之外?

作为我想要返回的示例,如果我的数据框具有从 A 到 Z 的因子级别,但在我的子集中仅出现 P、R 和 Y,我想要的东西 returns 级别 P , R 和 Y.

您当然可以使用 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)
  )

我修改了 Marat 评论中的建议,以使用似乎 return 正确级别的函数 unique

解决方案:

subsetrows <- which(is.na(mydata$reference))
unique(as.character(mydata$factor[subsetrows]))

虽然我喜欢学习新的包和函数,但这个解决方案在这一点上似乎更好,因为如果我需要在未来某个遥远的时间重新访问这段代码,它更紧凑,更容易理解。