按组填补第一个非缺失值前的缺失值 (NA)。

3

我的数据框以'id'为分组,并包含缺失值NA的变量'age'。

在每个'id'中,我想替换缺失的'age',但只能在第一个非NA值之前"填充"。

data <- data.frame(id=c(1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3),
                   age=c(NA,6,NA,8,NA,NA,NA,NA,3,8,NA,NA,NA,7,NA,9))

   id age
1   1  NA
2   1   6 # first non-NA in id = 1. Fill up from here
3   1  NA
4   1   8
5   1  NA
6   1  NA
7   2  NA
8   2  NA
9   2   3 # first non-NA in id = 2. Fill up from here
10  2   8
11  2  NA
12  3  NA
13  3  NA
14  3   7 # first non-NA in id = 3. Fill up from here
15  3  NA
16  3   9

期望的输出:

1   1   6
2   1   6
3   1  NA
4   1   8
5   1  NA
6   1  NA
7   2   3
8   2   3
9   2   3
10  2   8
11  2  NA
12  3   7
13  3   7
14  3   7
15  3  NA
16  3   9

我尝试使用以下代码将 fill 与 .direction = "up" 结合起来:

library(dplyr)
library(tidyr)

data1 <- data %>% group_by(id) %>%  
  fill(!is.na(age[1]), .direction = "up")
2个回答

3
另一个选项(对于缺失值和非缺失值的起始位置没有偏好)可以是:
data %>%
 group_by(id) %>%
 mutate(rleid = with(rle(is.na(age)), rep(seq_along(lengths), lengths)),
        age2 = ifelse(rleid == min(rleid[is.na(age)]), 
                      age[rleid == (min(rleid[is.na(age)]) + 1)][1],
                      age))

      id   age rleid  age2
   <dbl> <dbl> <int> <dbl>
 1     1    NA     1     6
 2     1     6     2     6
 3     1    NA     3    NA
 4     1     8     4     8
 5     1    NA     5    NA
 6     1    NA     5    NA
 7     2    NA     1     3
 8     2    NA     1     3
 9     2     3     2     3
10     2     8     2     8
11     2    NA     3    NA
12     3    NA     1     7
13     3    NA     1     7
14     3     7     2     7
15     3    NA     3    NA
16     3     9     4     9

3
你可以使用cumall(is.na(age))来查找第一个非 NA 值之前的位置。
library(dplyr)

data %>%
  group_by(id) %>%
  mutate(age2 = replace(age, cumall(is.na(age)), age[!is.na(age)][1])) %>%
  ungroup()

# A tibble: 16 × 3
      id   age  age2
   <dbl> <dbl> <dbl>
 1     1    NA     6
 2     1     6     6
 3     1    NA    NA
 4     1     8     8
 5     1    NA    NA
 6     1    NA    NA
 7     2    NA     3
 8     2    NA     3
 9     2     3     3
10     2     8     8
11     2    NA    NA
12     3    NA     7
13     3    NA     7
14     3     7     7
15     3    NA    NA
16     3     9     9

1
这是一个非常优雅的解决方案,但我认为如果在第一个NA值之前存在非NA值,它将无法工作。 - tmfmnk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接