【问题标题】:Replace specific observations with new set of observations based on conditions in r根据 r 中的条件,用一组新的观察值替换特定的观察值
【发布时间】:2020-04-28 15:51:39
【问题描述】:

我有一个包含一些自变量和一个响应变量的数据集。由于实验室估计的修正,一些响应值发生了变化。所以我需要用“新”观察的子集“更新”旧数据库。

我的问题是如何将“旧”值替换为整个集合的“新”观察子集?我可以一一使用 mutate 和 ifelse 来做到这一点,但实际的数据库非常庞大。但我需要自动执行此操作。

这是我的可重现示例:

data.old <- read.csv(text = "
year,location,treat,date,rep,response
2015,loc_a,High,1,1,0.806497184
2015,loc_a,High,1,2,0.571959654
2015,loc_a,High,1,1,0.019984888
2015,loc_a,High,1,2,0.526432749
2015,loc_a,High,2,1,0.325492808
2015,loc_a,High,2,2,0.263060123
2015,loc_a,High,2,1,0.057942716
2015,loc_a,High,2,2,0.677159318
2015,loc_a,Medium,1,1,0.01864298
2015,loc_a,Medium,1,2,0.677991164
2015,loc_a,Medium,1,1,0.316242859
2015,loc_a,Medium,1,2,0.803863895
2015,loc_a,Medium,2,1,0.645955727
2015,loc_a,Medium,2,2,0.856398777
2015,loc_a,Medium,2,1,0.252374162
2015,loc_a,Medium,2,2,0.793597331
2015,loc_a,Low,1,1,0.592899207
2015,loc_a,Low,1,2,0.293483001
2015,loc_a,Low,1,1,0.185614099
2015,loc_a,Low,1,2,0.148539171
2015,loc_a,Low,2,1,0.540534982
2015,loc_a,Low,2,2,0.391441647
2015,loc_a,Low,2,1,0.579447499
2015,loc_a,Low,2,2,0.298908079
")

new.data <- read.csv(text = "
treat,date,rep,response
High,1,2,2.3
High,2,1,2.1
Medium,1,2,1.2
Low,1,1,2.5
Low,2,1,2.2
Low,2,2,1.5
")

data.old.updated <- data.old %>% 
                        mutate(response = ifelse(treat == "High" & 
                                                 date == "1" &
                                                 rep == "2", 2.3, response))

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    您可以加入这两个表并从此开始:

    data.old %>% 
      # left join to keep all data
      left_join(new.data, by = c("treat", "date", "rep")) %>% 
      # coalesce returns the first nonmissing value
      mutate(response = coalesce(response.y, response.x)) %>% 
      select(-response.x, -response.y)
    #   year location treat date rep   response
    # 1 2015    loc_a  High    1   1 0.80649718
    # 2 2015    loc_a  High    1   2 2.30000000
    # 3 2015    loc_a  High    1   1 0.01998489
    # 4 2015    loc_a  High    1   2 2.30000000
    # 5 2015    loc_a  High    2   1 2.10000000
    

    【讨论】:

    • 非常感谢您的回复。超级高效。不知道合并功能。非常有用。
    猜你喜欢
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 2021-05-28
    • 2021-08-16
    相关资源
    最近更新 更多