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

Posted

技术标签:

【中文标题】R数据框 - 用另一列的条件填充缺失值【英文标题】:R data frame - fill missing values with condition on another column 【发布时间】:2022-01-17 19:01:48 【问题描述】:

在 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

我尝试过使用“填充”:

df %>% fill(age)

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

【问题讨论】:

尝试使用df %>% fill(Age) 你需要group_by(Id) %>% fill(...) 【参考方案1】:

cmets 很接近,您只需添加.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

【讨论】:

【参考方案2】:

假设这是您的数据框

df&lt;-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)

【讨论】:

【参考方案3】:

请使用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

【讨论】:

以上是关于R数据框 - 用另一列的条件填充缺失值的主要内容,如果未能解决你的问题,请参考以下文章

R语言把dataframe数据转化为tibble格式查看每个数据列的缺失值个数使用数据列的均值对数据列的缺失值进行填充

如何用其他数据框的值填充缺失值

如何使用 R 中基于面板数据的客户 ID 的所有列的中值插补填充缺失值?

R语言-均值填充缺失值

如何用条件填充缺失值?

如何将值从一列映射到另一列数据框? [复制]