【问题标题】:R: Replace missing values in one row based on unique ID for all variables in dataframeR:根据数据框中所有变量的唯一ID替换一行中的缺失值
【发布时间】:2020-11-14 14:52:03
【问题描述】:

我正在使用一个“长”数据框,其中独特的参与者随着时间的推移有多个观察结果。有些行缺少跨多列的数据,而这些缺失的记录需要为每个参与者填充相同的数据。

我的数据集如下所示:

list(
ID = c("A23", "A23", "A24", "A24", "A24", "A50", "A50", "A60", "A60"), 
A = c("Y", "Y", "N", "N", NA, "Y", NA, "N", "N"), 
B = c(2.4, 2.4, 2.6, 2.6, NA, 2.2, NA, 3.3, 3.3), 
C = c("M", "M", "F", "F", NA, "F", NA, "M", "M"), 
D = c(1, 1, 0, 0, NA, 1, NA, 1, 1), 
E = c("2015-02-16", "2017-10-05", "2014-03-26", "2016-09-07", "2018-10-08", "2015-02-17", "2017-10-06", "2014-03-27", "2016-09-08"))

我希望能够简单地从完整/非缺失行中复制数据,并将其粘贴到基于 ID 变量的缺失记录中,跨越整个数据框。

我尝试了以下方法都无济于事(没有替换缺失值):

library(tidyverse)
library(zoo)
library(plyr)

# Attempt 1:
data %>%
  group_by(ID) %>%
  mutate_all(~replace(., is.na(.), .[!is.na(.)][1]))

# Attempt 2:
plyr::ddply(data, ~ID, na.locf)

对于需要替换单个列的缺失值的情况,我找到了解决方案,但我还没有找到用于在整个数据帧中替换缺失值的解决方案。

提前致谢。

【问题讨论】:

    标签: r dplyr tidyr missing-data data-wrangling


    【解决方案1】:

    来自tidyrfill() 应该可以工作:

    df %>%
      group_by(ID) %>%
      fill(names(df))
    
    # A tibble: 9 x 6
    # Groups:   ID [4]
      ID    A         B C         D E         
      <chr> <chr> <dbl> <chr> <dbl> <chr>     
    1 A23   Y       2.4 M         1 2015-02-16
    2 A23   Y       2.4 M         1 2017-10-05
    3 A24   N       2.6 F         0 2014-03-26
    4 A24   N       2.6 F         0 2016-09-07
    5 A24   N       2.6 F         0 2018-10-08
    6 A50   Y       2.2 F         1 2015-02-17
    7 A50   Y       2.2 F         1 2017-10-06
    8 A60   N       3.3 M         1 2014-03-27
    9 A60   N       3.3 M         1 2016-09-08
    

    【讨论】:

      【解决方案2】:

      您可以使用 dplyr 中的 group_by/mutate 方法解决此问题:

      library(dplyr)
      df <- tibble(
        ID = c("A23", "A23", "A24", "A24", "A24", "A50", "A50", "A60", "A60"), 
        A = c("Y", "Y", "N", "N", NA, "Y", NA, "N", "N"), 
        B = c(2.4, 2.4, 2.6, 2.6, NA, 2.2, NA, 3.3, 3.3), 
        C = c("M", "M", "F", "F", NA, "F", NA, "M", "M"), 
        D = c(1, 1, 0, 0, NA, 1, NA, 1, 1), 
        E = c("2015-02-16", "2017-10-05", "2014-03-26", "2016-09-07", "2018-10-08", 
       "2015-02-17", "2017-10-06", "2014-03-27", "2016-09-08"))
      
      
      
      fix_nas <- function(x){
        x[complete.cases(x)][1]
      
      }
      
      df %>% 
        group_by(ID) %>% 
        mutate_at(2:5, fix_nas) 
      

      【讨论】:

      • 您需要澄清“它用缺失值(不仅仅是缺失值)替换了行中的所有值”是什么意思。他们似乎和我一样
      猜你喜欢
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 2014-10-04
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多