【问题标题】:fill in missing data for group by unique ID [duplicate]按唯一ID填写组的缺失数据[重复]
【发布时间】:2020-12-14 23:21:18
【问题描述】:

我的临床数据结构如下所示:

patientid <- c(100,100,100,101,101,101,102,102,102,104,104,104)
group <- c(1,1,NA,2,NA,NA,1,1,1,2,2,NA)

Data<- data.frame(patientid=patientid,group=group)

如果缺少数据,则 NA 应与同一患者 ID 的其他组值相同。换句话说,患者总是在同一组中,需要填写缺失的数据以反映这一点。所以它应该是这样的:

patientid <- c(100,100,100,101,101,101,102,102,102,104,104,104)
group <- c(1,1,1,2,2,2,1,1,1,2,2,2)

Data<- data.frame(patientid=patientid,group=group)

【问题讨论】:

    标签: r missing-data


    【解决方案1】:

    你可以写一个小辅助函数,比如:

    fun <- function(x) replace(x, is.na(x), x[!is.na(x)][1])
    

    然后,你可以在transformwithin 中使用它:

    transform(Data, group = ave(group, patientid, FUN = fun))
    #    patientid group
    # 1        100     1
    # 2        100     1
    # 3        100     1
    # 4        101     2
    # 5        101     2
    # 6        101     2
    # 7        102     1
    # 8        102     1
    # 9        102     1
    # 10       104     2
    # 11       104     2
    # 12       104     2
    

    甚至与其他软件包一起使用:

    library(data.table)
    as.data.table(Data)[, group := fun(group), patientid][]
    

    即使组值不是每个患者“患者 ID”的第一个值,这也会起作用。试试,例如:

    # First row of "group" is `NA`
    Data <- Data[c(3, 1, 2, 4:nrow(Data)), ]
    

    【讨论】:

      【解决方案2】:

      我们可以使用tidyr中的fill,通过'patientid'分组后

      library(dplyr)
      library(tidyr)
      Data %>%
           group_by(patientid) %>% 
           fill(group) %>%
           ungroup
      

      -输出

      # A tibble: 12 x 2
      #   patientid group
      #       <dbl> <dbl>
      # 1       100     1
      # 2       100     1
      # 3       100     1
      # 4       101     2
      # 5       101     2
      # 6       101     2
      # 7       102     1
      # 8       102     1
      # 9       102     1
      #10       104     2
      #11       104     2
      #12       104     2
      

      【讨论】:

        【解决方案3】:

        带有ave 的基本 R 选项可以实现

        transform(
          Data,
          group = ave(group, patientid, FUN = function(x) unique(na.omit(x)))
        )
        

        给了

           patientid group
        1        100     1
        2        100     1
        3        100     1
        4        101     2
        5        101     2
        6        101     2
        7        102     1
        8        102     1
        9        102     1
        10       104     2
        11       104     2
        12       104     2
        

        data.table 选项与nafill

        setDT(Data)[, group := nafill(group, fill = unique(na.omit(group))), patientid]
        

        给了

        > Data
            patientid group
         1:       100     1
         2:       100     1
         3:       100     1
         4:       101     2
         5:       101     2
         6:       101     2
         7:       102     1
         8:       102     1
         9:       102     1
        10:       104     2
        11:       104     2
        12:       104     2
        

        【讨论】:

          【解决方案4】:

          dplyr:

          Data%>%group_by(patientid)%>%mutate(group=(ifelse(is.na(group),max(group,na.rm=TRUE),group)))
          

          【讨论】:

            【解决方案5】:

            您可以在 group 和 patientid 之间创建一个映射,然后使用此映射来填充缺失值。

            # Create mapping btw group and patientid
            df = data.frame(patientid, group)
            patientid.unique = unique(patientid)
            mapping = data.frame(pid=patientid.unique, group=NA)
            for (pid in patientid.unique){
              mapping$group[mapping$pid == pid] = unique(df[df$patientid == pid & !is.na(df$group), "group"])
            }
            
            > mapping
              pid group
            1 100     1
            2 101     2
            3 102     1
            4 104     2
            
            # Fill in missing values
            group.filled = apply(df, 1, function(x) {mapping$group[mapping$pid == x[1]] })
            df$group = group.filled
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-07-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-05-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多