【问题标题】:Filling NA values for all obs within the same group为同一组内的所有 obs 填充 NA 值
【发布时间】:2019-08-08 12:22:54
【问题描述】:

我有一个医疗数据,其中某些条件指标(即列)仅适用于某些行,但实际上,相同的条件应明确应用于属于相同治疗的所有观察结果(即program) .因此,填充 NA 似乎很简单(因为它们都被假定具有相同的值)但也不容易,因为当我应用一些先前线程(例如,herehere)推荐的方法时,它们似乎填充字符串值有问题,如下代码所示。

有解决办法吗?

df_example <- data.frame(patient = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
                    status = c("Active", NA, NA, NA, "Non-Active", NA, NA, NA, "Active"),
                    condition = c(NA, "I", NA, NA, "II", "II", NA, NA, "III"), 
                    program = c(1, 1, 1, 2, 2, 2, 3, 3, 3))

# I want to fill all the NA cells for columns "status" and "condition" by each program, the values should be the same for obs belonging to the same program

library("dplyr")
library("zoo")

df_example %>% group_by(program) %>% transmute(status=na.locf(status, na.rm=FALSE))

# A tibble: 9 x 2
# Groups:   program [3]
  program status    
    <dbl> <fct>     
1       1 Active    
2       1 Active    
3       1 Active    
4       2 NA        
5       2 Non-Active
6       2 Non-Active
7       3 NA        
8       3 NA        
9       3 Active 

【问题讨论】:

    标签: r dplyr na zoo


    【解决方案1】:

    假设每组中恰好有一个非NA:

    df_example %>%
      group_by(program) %>%
      transmute(status = na.omit(status)) %>%
      ungroup
    

    或者如果有多个非 NA 但所有非 NA 都相同:

    df_example %>%
      group_by(program) %>%
      transmute(status = first(na.omit(status))) %>%
      ungroup
    

    给予:

    # A tibble: 9 x 2
      program status    
        <dbl> <fct>     
    1       1 Active    
    2       1 Active    
    3       1 Active    
    4       2 Non-Active
    5       2 Non-Active
    6       2 Non-Active
    7       3 Active    
    8       3 Active    
    9       3 Active    
    

    【讨论】:

    • OP 可能正在寻找 - df_example %&gt;% group_by(program) %&gt;% mutate_at(vars("status", "condition"), ~first(na.omit(.)))
    • 您好,感谢您的回复。与@Sotos 推荐的解决方案一样,当我检查所有 NA 单元格是否已填满length(df_example$status[is.na(df_example$status)]) 时,它返回 6。
    • @ChrisT。如果某些组拥有所有NAs,则可能会发生这种情况。
    • 但是对于我的示例数据 (df_example),这看起来不正确。
    • 将结果赋值给一个变量,然后查看它。它不会修改输入。我已经展示了输出,所以你可以看到它确实有效。
    【解决方案2】:

    您还需要添加na.locffromLast 参数,即

    library(dplyr)
    library(zoo)
    
    df_example %>% 
      group_by(program) %>% 
      transmute(status = na.locf(status, na.rm = FALSE), 
                status = na.locf(status, fromLast = TRUE))
    
    # A tibble: 9 x 2
    # Groups:   program [3]
    #  program status    
    #    <dbl> <fct>     
    #1       1 Active    
    #2       1 Active    
    #3       1 Active    
    #4       2 Non-Active
    #5       2 Non-Active
    #6       2 Non-Active
    #7       3 Active    
    #8       3 Active    
    #9       3 Active    
    

    【讨论】:

    • 感谢您的快速回复。代码运行良好,但我有点困惑的是,当我检查是否所有 NA 单元格都已填满 length(df_example$status[is.na(df_example$status)]) 时,它返回 6。奇怪!
    • 你们有没有只有 NA 的组?
    • 不,他们至少有一行不是NA
    • 另外,如果您输入df_example,R 将返回相同的数据框,其中NA 单元格未填充。
    • 在我将transmuted对象分配给一个新的数据框(使用原始名称df_example)后,length(df_example2$status[is.na(df_example2$status)]) 确实是0。我只是忘记了需要分配transmuted/将 dplyr 对象变异为新的数据框,以获取转换/变异的列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多