R : select 组只有缺失值

R : select groups with only missing values

我有一个如下所示的数据框:

group = c(rep("a",3), rep("b",5), rep("c",4), rep("d",4))
value = c(NA, NA, NA, 5,7,8,NA,9, NA,NA,NA,NA, 7,9,7,2)
data = cbind(group, value)
data = as.data.frame(data) 

我想显示一个新的 table,其中的组只包含 NA。即 A 组和 C 组,但不是 B 组,因为有一些值。我该怎么做?

我想要的结果应该是这样的 table :

提前感谢您的帮助!

如果您只对保留一个数据框感兴趣,那么这里有一种 hack 方法,其中每个组的 all 值是 NA:

library(tidyverse)

data %>% 
  group_by(group) %>% 
  fill(value, .direction = 'updown') %>% 
  filter(is.na(value))

给我们:

# A tibble: 7 x 2
# Groups:   group [2]
  group value
  <chr> <chr>
1 a     NA   
2 a     NA   
3 a     NA   
4 c     NA   
5 c     NA   
6 c     NA   
7 c     NA   

Base R中我们可以使用aggregate()

代码

# check which group only consists of NAs
tmp1 <- aggregate(data$value, list(data$group), function(x){
  all(is.na(x))
})

# subset to desired data format
tmp1[tmp1$x == T,]

#   Group.1    x
# 1       a TRUE
# 3       c TRUE

更新

我们甚至可以让它更清晰一点,同时使用变量名 na.pass

# check which group only consists of NAs
tmp1 <- aggregate(value ~ group, data, function(x){
  all(is.na(x))
}, na.action = na.pass)

# subset 
tmp1[tmp1$value == T,]

#   group value
# 1     a  TRUE
# 3     c  TRUE

使用 tidyverse,找出哪个组只包含 NA 非常简单:

library(tidyverse)
result <- data %>%
group_by(group) %>%
summarize(onlyNA = all(is.na(value)))

然后您可以过滤结果:filter(result, onlyNA == T)

tidyverse 是一个相当大的依赖项,因此根据项目的总体大小,为这个小脚本安装和加载它可能会过大。在这种情况下,请参阅 Base_R_Best_R 的答案。不过,我认为这里的代码更清晰。

使用data.table

library(data.table)
setDT(data)[, sum(is.na(value)) == .N, group]