【问题标题】:Assign value or delete rows conditionally on two columns有条件地在两列上赋值或删除行
【发布时间】:2017-03-05 11:07:02
【问题描述】:

我刚刚在 R 中合并纵向数据并发现了一个问题。我的数据框 df 看起来(大致)是这样的:

Clinic   ID   Year    Result  
A         1   2000        50
A         1   2002
A         1   2004     
A         2   2000      
A         2   2002      
A         2   2004      1100
B         1   2000
B         1   2002
B         1   2004 

我们需要具有测试结果的患者所有年份的数据,以及一种将结果值分配给该患者所有行的方法。我需要丢弃没有记录任何结果的患者。在此示例中,我需要保留诊所 A 中患者 1 和 2 的所有行,但丢弃诊所 B 中患者 1 的所有行。此外,在诊所 A 中,我需要患者 1 的所有行列出“50”,因为是他的测试结果。

我认为最终我可以使用:df[!is.na(df$Result),]... 但我无法弄清楚如何在删除之前将“结果”值共享给所有相关行不适用。

df <- transform(df, NewResult = (Clinic, ID, Fun=Function(Result) ifelse(Result>0 == Result, NA))

这不起作用;它返回了一个错误。指导非常感谢。

我需要的是:

Clinic   ID   Year    Result  
A         1   2000        50
A         1   2002        50
A         1   2004        50
A         2   2000      1100
A         2   2002      1100
A         2   2004      1100
B         1   2000        NA
B         1   2002        NA
B         1   2004        NA

【问题讨论】:

    标签: r conditional transform


    【解决方案1】:

    我们可以使用zoo 中的na.locf 执行此操作,以便在按“诊所”和“ID”分组后用非 NA 值填充 NA 值

    library(data.table)
    library(zoo)
    setDT(df)[, Result := na.locf(na.locf(Result, na.rm = FALSE), 
                            fromLast=TRUE, na.rm = FALSE), .(Clinic, ID)]
    

    或者我们可以使用来自tidyversefill

    library(tidyverse)
    df %>% 
       group_by(Clinic, ID) %>% 
       fill(Result) %>%
       fill(Result, .direction = "up")    
    #   Clinic    ID  Year Result
    #   <chr> <int> <int>  <int>
    #1      A     1  2000     50
    #2      A     1  2002     50
    #3      A     1  2004     50
    #4      A     2  2000   1100
    #5      A     2  2002   1100
    #6      A     2  2004   1100
    #7      B     1  2000     NA
    #8      B     1  2002     NA
    #9      B     1  2004     NA
    

    【讨论】:

    • na.locf 奏效了!虽然我无法让 tidyverse 填充工作,但第一个解决了我的问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多