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_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
评论已关闭,您只需添加 .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
在 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_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
评论已关闭,您只需添加 .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