【发布时间】:2019-12-06 09:39:13
【问题描述】:
如何在 group_by 之后使用 dplyr 应用函数来删除具有 2 个或更多连续 NA 的组?我编写了一个函数,无论数据框中的列是否有 2 个或更多 NA,它都会输出 True 或 False:
# function for determining if ts contains consecutive NAs
is.na.contiguous <- function(df, consecutive) {
na.rle <- rle(is.na(df$b))
na.rle$values <- na.rle$values & na.rle$lengths >= consecutive
any(na.rle$values)
}
# example df
d = structure(list(a = c(1, 2, 3, 4, 5, 6, 7, 8), b = c(1, 2, 2,
+ NA, NA, 2, NA, 2), c = c(1, 1, 1, 2, 2, 2, 3, 3)), class = "data.frame", row.names = c(NA,
+ -8L))
head(d)
a b c
1 1 1 1
2 2 2 1
3 3 2 1
4 4 NA 2
5 5 NA 2
6 6 2 2
7 7 NA 3
8 8 2 3
# test function
is.na.contiguous(d,2)
TRUE # column b has 2 consecutive NAs
is.na.contiguous(d,3)
FALSE # column b does not have 3 consecutive NAs
现在如何将此函数应用于数据框中的每个组?以下是我尝试过的:
d %>% group_by(c) %>% mutate(consecNA = is.na.contiguous(.,2)) %>% as.data.frame()
a b c consecNA
1 1 1 1 TRUE
2 2 2 1 TRUE
3 3 2 1 TRUE
4 4 NA 2 TRUE
5 5 NA 2 TRUE
6 6 2 2 TRUE
7 7 NA 3 TRUE
8 8 2 3 TRUE
我做错了什么?
【问题讨论】:
-
添加一列,
d %>% group_by(c) %>% mutate(consecNA = any(is.na(b) & lag(is.na(b), default = FALSE)));删除组,d %>% group_by(c) %>% filter(!any(is.na(b) & lag(is.na(b), default = FALSE))) -
@TYL 你能显示预期的输出吗?是一列逻辑向量还是你要过滤
-
我的最终目标是过滤,但我似乎找不到方法。所以我的想法是改变一列逻辑向量,然后根据该列进行过滤。