R:在group_by中将下一行设置为NA



如果第I行已经有NA,我想将同一列中的下一行I+1设置为NA,然后分组执行。这是我的尝试:

dfeg <- tibble(id = c(rep("A", 5), rep("B", 5)),
x = c(1, 2, NA, NA, 3, 5, 6, NA, NA, 7))
setNextrowtoNA <- function(x){

for (j in 1:length(x)){

if(is.na(x[j])){x[j+1] <- NA}

}
}
dfeg <- dfeg %>% group_by(id) %>% mutate(y = setNextrowtoNA(x))

然而,我的尝试并没有创建我想要的列y。有人能帮忙吗?谢谢

编辑:在我的实际数据中,我在一行中有多个值需要设置为NA,例如,我的数据更像这样:

dfeg <- tibble(id = c(rep("A", 6), rep("B", 6)),
x = c(1, 2, NA, NA, 3, 4, 15, 16, NA, NA, 17, 18))

需要创建这样的列:

y = c(1, 2, NA, NA, NA, NA, 15, 16, NA, NA, NA, NA)

有什么想法吗?谢谢

编辑2:

我自己想出来的,这似乎奏效了:

dfeg <- tibble(id = c(rep("A", 6), rep("B", 6)),
x = c(1, 2, NA, NA, 3, 4,  15, 16, NA, NA, 17, 18))
setNextrowtoNA <- function(x){

for (j in 1:(length(x))){

if(is.na(x[j]))
{
x[j+1] <- NA
}
lengthofx <- length(x)
x <- x[-lengthofx]
print(x[j])
}
return(x)
}
dfeg <- dfeg %>% group_by(id) %>% mutate(y = NA,
y = setNextrowtoNA(x))

使用cumany:

library(dplyr)
dfeg %>% 
group_by(id) %>% 
mutate(y = ifelse(cumany(is.na(x)), NA, x))
id        x     y
<chr> <dbl> <dbl>
1 A         1     1
2 A         2     2
3 A        NA    NA
4 A        NA    NA
5 A         3    NA
6 A         4    NA
7 B        15    15
8 B        16    16
9 B        NA    NA
10 B        NA    NA
11 B        17    NA
12 B        18    NA

上一个答案:

ifelse语句与lag:一起使用

library(dplyr)
dfeg %>% 
group_by(id) %>% 
mutate(y = ifelse(is.na(lag(x, default = 0)), NA, x))

最新更新