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]
我有一个如下所示的数据框:
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]