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

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

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

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

回答(2)

3 years ago

你当然可以用 base 函数来完成这个任务 . 但我个人的偏好是使用带有链接操作的 dplyr ,例如:

library(dplyr)

d %>%
  filter(is.na(ref)) %>%
  select(field) %>%
  distinct()

data

d <- data.frame(
  field = c("A", "B", "C", "A", "B", "C"),
  ref = c(NA, "a", "b", NA, "c", NA)
  )

3 years ago

我在Marat的评论中修改了一个建议,使用似乎返回正确级别的函数 unique .

解:

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

虽然我喜欢学习新的软件包和函数,但是这个解决方案在这一点上看起来似乎更好,因为如果我需要在未来某个遥远的地方重新访问这些代码,我会更容易理解它 .