【问题标题】:Match and extract values for subset of dataframe匹配和提取数据框子集的值
【发布时间】:2018-01-23 13:28:39
【问题描述】:

我正在尝试根据与另一个数据帧的匹配来替换一个数据帧中的某些值。

df1 <- data.frame("round" = c(1,1,1,2,2,2,3,3,3),
              'geocode' = c('AAA', 'BBB', 'CCC', 'AAA', 'BBB', 'CCC', 'AAA', 'BBB', 'CCC'),
              'value1' = c(111, 222, 333, NA, NA, NA, 777, 888, 999))

df2 <- data.frame('geocode' = c('AAA', 'BBB', 'CCC'), 'value2' = c(444, 555, 666))

期望的输出:

out.df <- data.frame("round" = c(1,1,1,2,2,2,3,3,3),
                 'geocode' = c('AAA', 'BBB', 'CCC', 'AAA', 'BBB', 'CCC', 'AAA', 'BBB', 'CCC'),
                 'value1' = c(111, 222, 333, 444, 555, 666, 777, 888, 999))

我尝试的解决方案:

df1[df1$round == 2, 'value1'] <- df2$value2[match(df1$geocode, df2$geocode)]

我似乎无法解决两个数据帧具有不同行数的事实。

【问题讨论】:

    标签: r match


    【解决方案1】:

    你失去了一个条件

    df1[df1$round == 2, 'value1'] <- df2$value2[match(df1[df1$round == 2, 'geocode'], df2$geocode)]
    

    【讨论】:

    • 谢谢,我知道我需要这样的东西,但无法准确获得。非常感谢。
    【解决方案2】:

    您似乎只想替换 df1$value1 中的 NA。在这种情况下,您需要指定此条件,即

    df1$value1[is.na(df1$value1)] <- df2$value2[match(df1$geocode, df2$geocode)][is.na(df1$value1)]
    

    【讨论】:

    • 谢谢,我在虚拟 df 中使用了 NA,因此这个解决方案也有效。在实际 df 中存在非 NA 值;下次会更小心的。
    【解决方案3】:

    这个怎么样?

    library(plyr)
    df=join(df1,df2,by="geocode",type="left")
    df[is.na(df$value1),]$value1=df[is.na(df$value1),]$value2
    

    【讨论】:

    • 你是对的,它来自 plyr 包,我在代码中添加了库
    • 为什么不简单地使用merge 而不是仅仅为了加入而加载一个包?
    猜你喜欢
    • 2021-10-27
    • 2017-12-15
    • 2022-11-22
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多