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<-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_by
。 arrange
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格式查看每个数据列的缺失值个数使用数据列的均值对数据列的缺失值进行填充