用上一行的值填充行的子集

时间:2019-09-13 10:26:12

标签: r

我有一个包含纵向数据的长格式数据集,对于一个变量,我想用时间点1的值填充时间点0的缺失,但我不想用时间点的值填充时间点1的缺失2,依此类推。 我的数据集按ID和时间点排序。

在仅需要填充特定ID的所有时间点的缺失的情况下,我已成功使用填充功能。

示例数据框:

df <- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4),
                 timepoint=c(0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3),
                 var1=c(NA,9,8,10, NA, 10, NA, 12, NA, NA, 12, 11, NA, 12, 12, NA))

> df
   id timepoint var1
1   1         0   NA
2   1         1    9
3   1         2    8
4   1         3   10
5   2         0   NA
6   2         1   10
7   2         2   NA
8   2         3   12
9   3         0   NA
10  3         1   NA
11  3         2   12
12  3         3   11
13  4         0   NA
14  4         1   12
15  4         2   12
16  4         3   NA

无论何时,只要我需要填补所有缺失,这就是有效的方法:

library(dplyr)
library(tidyr)

df <- df %>%
  group_by(id) %>% 
  fill(`var9`:`var12`, .direction = "up") %>%
  as.data.frame

但是现在我很难指定仅在时间点0填写行中的缺失内容。我们将提供任何帮助。

我的预期输出:

> df
   id timepoint var1
1   1         0    9
2   1         1    9
3   1         2    8
4   1         3   10
5   2         0   10
6   2         1   10
7   2         2   NA
8   2         3   12
9   3         0   NA
10  3         1   NA
11  3         2   12
12  3         3   11
13  4         0   12
14  4         1   12
15  4         2   12
16  4         3   NA

2 个答案:

答案 0 :(得分:2)

这可能是一个过分的简化,但是您可以再次调用fill函数,但这一次是向下的。然后,您的整个数据框将完成。

df <- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4),
                 timepoint=c(0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3),
                 var1=c(NA,9,8,10, NA, 10, NA, 12, NA, NA, 12, 11, NA, 12, 12, NA))

在这种情况下,我将使用ifelse语句后跟lead函数。

library(dplyr); library(tidyr);
df %>% 
  group_by(id) %>% 
  mutate(var1 = ifelse(is.na(var1) & timepoint == 0, 
                       lead(var1, 1), var1))

收益:

# A tibble: 16 x 3
# Groups:   id [4]
      id timepoint  var1
   <dbl>     <dbl> <dbl>
 1     1         0     9
 2     1         1     9
 3     1         2     8
 4     1         3    10
 5     2         0    10
 6     2         1    10
 7     2         2    NA
 8     2         3    12
 9     3         0    NA
10     3         1    NA
11     3         2    12
12     3         3    11
13     4         0    12
14     4         1    12
15     4         2    12
16     4         3    NA

答案 1 :(得分:1)

我们可以group_by id并使用replace从相应的{值更改timepoint = 0var1NA的值{1}},每组var1

timepoint = 1