使用上面行中的值填充行的子集

  • 本文关键字:填充 子集 r
  • 更新时间 :
  • 英文 :


我有一个包含纵向数据的长格式数据集,对于一个变量,我想用时间点 1 中的值填充时间点 0 中的缺失,但我不想用时间点 2 的值填充时间点 1 中的缺失,依此类推。 我的数据集按 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

这可能是过度简化,但您可以再次调用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

我们可以group_byid并使用replacetimepoint = 0var1NA的值从每个组中的相应值var1wheretimepoint = 1更改。

library(dplyr)
df %>%
group_by(id) %>%
mutate(var2 = replace(var1, timepoint == 0 & is.na(var1), var1[timepoint == 1]))
#     id timepoint  var1  var2
#   <dbl>     <dbl> <dbl> <dbl>
# 1     1         0    NA     9
# 2     1         1     9     9
# 3     1         2     8     8
# 4     1         3    10    10
# 5     2         0    NA    10
# 6     2         1    10    10
# 7     2         2    NA    NA
# 8     2         3    12    12
# 9     3         0    NA    NA
#10     3         1    NA    NA
#11     3         2    12    12
#12     3         3    11    11
#13     4         0    NA    12
#14     4         1    12    12
#15     4         2    12    12
#16     4         3    NA    NA

最新更新