【问题标题】:Recoding missing data in longitudinal data frames with R用 R 重新编码纵向数据帧中的缺失数据
【发布时间】:2017-01-31 07:26:09
【问题描述】:

我有一个纵向结构与data相似的数据框:

data = data.frame (
   ID = c("a","a","a","b","b","b","c","c", "c"), 
   period = c(1,2,3,1,2,3,1,2,3),
   size = c(3,3,NA, NA, NA,1, 14,14, 14))

变量size 的值是固定的,因此每个周期对于size 具有相同的值。然而,一些观察结果存在缺失值。我的目标是替换这些缺失值 size 的值与没有缺失的时段相关联(例如,ID "a" 为 3,ID "b" 为 1)。

所需的数据框应类似于:

data.1 

    ID period value
      a      1     3
      a      2     3
      a      3     3
      b      1     1
      b      2     1
      b      3     1
      c      1    14
      c      2    14
      c      3    14

我尝试了以下公式的不同组合,但没有得到我想要的结果。

library(dplyr)

data.1 = data %>% group_by(ID) %>% 
  mutate(new.size = ifelse(is.na(size), !is.na(size),
                          ifelse(!is.na(size), size, 0)))

产生以下结果:

data.1
Source: local data frame [9 x 4]
Groups: ID [3]

      ID period  size new.size
  (fctr)  (dbl) (dbl)    (dbl)
1      a      1     3        3
2      a      2     3        3
3      a      3    NA        0
4      b      1    NA        0
5      b      2    NA        0
6      b      3     1        1
7      c      1    14       14
8      c      2    14       14
9      c      3    14       14

如果有人能给我提示如何获得正确的解决方案,我将不胜感激。

【问题讨论】:

    标签: r missing-data panel-data


    【解决方案1】:

    base R 怎么样:

    vals <- unique(na.omit(data[, c("ID", "size")]))
    data$size <- vals$size[match(data$ID, vals$ID)]
    
    
      ID period size
    1  a      1    3
    2  a      2    3
    3  a      3    3
    4  b      1    1
    5  b      2    1
    6  b      3    1
    7  c      1   14
    8  c      2   14
    9  c      3   14
    

    【讨论】:

    • 您也可以使用dplyr,即data %&gt;% group_by(ID) %&gt;% mutate(new.size = size[!is.na(size)][1])
    【解决方案2】:

    要更正您的代码,您可以使用dplyr 尝试以下操作

    library(dplyr)
    data %>% group_by(ID) %>% 
             mutate(new.size = ifelse(is.na(size), size[!is.na(size)],size))
    
    #      ID   period  size new.size
    #     (fctr)  (dbl) (dbl)    (dbl)
    #1      a      1     3        3
    #2      a      2     3        3
    #3      a      3    NA        3
    #4      b      1    NA        1
    #5      b      2    NA        1
    #6      b      3     1        1
    #7      c      1    14       14
    #8      c      2    14       14
    #9      c      3    14       14
    

    base R 替代ave

    data$new.size <- ave(data$size,data$ID, FUN=function(x)unique(x[!is.na(x)]))
    data$new.size
    
    #[1]  3  3  3  1  1  1 14 14 14
    

    【讨论】:

      【解决方案3】:

      这里使用dplyrna.omit 的另一个解决方案

      group_by(data, ID) %>%
           mutate(value=na.omit(size)[1])
      Source: local data frame [9 x 4]
      Groups: ID [3]
      
            ID period  size value
        <fctr>  <dbl> <dbl> <dbl>
      1      a      1     3     3
      2      a      2     3     3
      3      a      3    NA     3
      4      b      1    NA     1
      5      b      2    NA     1
      6      b      3     1     1
      7      c      1    14    14
      8      c      2    14    14
      9      c      3    14    14
      

      请注意,如果您正在寻找最大值,例如,您可以将 na.omit 替换为 max(size, na.rm=TRUE)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多