R 数据框 - 用另一列的条件填充缺失值

R data frame - fill missing values with condition on another column

在 R 中,我有以下数据框:

Id Year Age
1 2000 25
1 2001 NA
1 2002 NA
2 2000 NA
2 2001 30
2 2002 NA

每个Id至少有一行填满年龄。 我想用每个 ID 的正确年龄填充缺失的“年龄”值。

预期结果:

Id Year Age
1 2000 25
1 2001 25
1 2002 25
2 2000 30
2 2001 30
2 2002 30

我试过使用 'fill':

df %>% fill(age)

但没有得到预期的结果。 有没有简单的方法可以做到这一点?

假设这是您的数据框

df<-data.frame(id=c(1,1,1,2,2,2),year=c(2000,2001,2002,2000,2001,2002),age=c(25,NA,NA,NA,30,NA))

有了zoo包,可以试试

library(zoo)
df<-df[order(df$id,df$age),]
df$age<-na.locf(df$age)

请参阅下面使用 tidyverse 库的解决方案。

library(tidyverse)    
dt  <- data.frame(Id = rep(1:2, each = 3),
                  Year = rep(2000:2002, each = 2),
                  Age = c(25,NA,NA,30,NA,NA))

dt %>% group_by(Id) %>% arrange(Id,Age) %>% fill(Age)

在您提供的代码中,您没有使用group_byarrange by Id 和 Age 也很重要,因为函数 fill 只是向下填充列。例如,查看该数据框,并比较有无 arrange:

的选项
dt  <- data.frame(Id = rep(1:2, each = 3),
                  Year = rep(2000:2002, each = 2),
                  Age = c(NA, 25,NA,NA,30,NA))

dt %>% group_by(Id) %>% fill(Age) # only fills partially
dt %>% group_by(Id) %>% arrange(Id,Age) %>% fill(Age) # does the right job

评论已关闭,您只需添加 .direction

df %>% group_by(Id) %>% fill(Age, .direction="downup")
# A tibble: 6 x 3
# Groups:   Id [2]
     Id  Year   Age
  <int> <int> <int>
1     1  2000    25
2     1  2001    25
3     1  2002    25
4     2  2000    30
5     2  2001    30
6     2  2002    30