【问题标题】:R data frame - fill missing values with condition on another columnR数据框 - 用另一列的条件填充缺失值
【发布时间】: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(...)

标签: r dataframe conditional-statements na 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_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
      

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多