【问题标题】:combine two similar columns in r在 r 中合并两个相似的列
【发布时间】:2019-11-30 02:44:30
【问题描述】:

我正在尝试合并两列数据,这些数据本质上包含相同的信息,但每一列都缺少另一列所没有的一些值。 “wasiIQw1”列保存组中一半的数据,而列 w1iq 保存组中另一半的数据。

select(gadd.us,nidaid,wasiIQw1,w1iq)[1:10,]

    select(gadd.us,nidaid,wasiIQw1,w1iq)[1:10,]
         nidaid wasiIQw1 w1iq
1  45-D11150341      104   NA
2  45-D11180321       82   NA
3  45-D11220022       93   93
4  45-D11240432      118   NA
5  45-D11270422       99   NA
6  45-D11290422       82   82
7  45-D11320321       99   99
8  45-D11500021       99   99
9  45-D11500311       95   95
10 45-D11520011      111  111

    select(gadd.us,nidaid,wasiIQw1,w1iq)[384:394,]
       nidaid wasiIQw1 w1iq
384 H1900442S       NA   62
385 H1930422S       NA   83
386 H1960012S       NA   89
387 H1960321S       NA   90
388 H2020011S       NA   96
389 H2020422S       NA  102
390 H2040011S       NA  102
391 H2040331S       NA   94
392 H2040422S       NA  103
393 H2050051S       NA   86
394 H2050341S       NA   98

通过以下代码,我将 df.a(带有 id 和 wasiIQw1 的 df)与 df.b(带有 id 和 w1iq 的 df)加入并得到以下结果。

df.join <- semi_join(df.a,
                     df.b,
                     by = "nidaid")

     nidaid w1iq
1  45-D11150341   NA
2  45-D11180321   NA
3  45-D11220022   93
4  45-D11240432   NA
5  45-D11270422   NA
6  45-D11290422   82
7  45-D11320321   99
8  45-D11500021   99
9  45-D11500311   95
10 45-D11520011  111

    nidaid w1iq
384 H1900442S   62
385 H1930422S   83
386 H1960012S   89
387 H1960321S   90
388 H2020011S   96
389 H2020422S  102
390 H2040011S  102
391 H2040331S   94
392 H2040422S  103
393 H2050051S   86
394 H2050341S   98

除了不会合并的前四个“NA”之外,所有这些都有效。 dplyr 的其他“_join”功能也没有工作。你有什么技巧可以组合这两列,这样不会丢失数据,但如果另一列有现值,则所有“NA”都会被填写?

【问题讨论】:

    标签: r merge dplyr tidyr


    【解决方案1】:

    我猜你可以在这里使用coalesce,它会在每个位置找到第一个非缺失值。

    library(dplyr)
    gadd.us %>% mutate(w1iq = coalesce(w1iq, wasiIQw1))
    

    这将从w1iq 中选择值(如果存在)或者如果w1iqNA,那么它将从wasiIQw1 中选择值。如果要优先考虑wasiIQw1,可以切换w1iqwasiIQw1的位置。

    【讨论】:

    • 谢谢罗纳克!这几乎奏效了,但让我找到了一个可行的解决方案。我必须隔离这两个变量,然后将它们合并为一个新变量,然后将其合并到主数据集!
    【解决方案2】:

    这是一种使用基础 R 的方法(无包)

    创建可重现的数据:

    > dat<-data.frame(nidaid=paste0("H",c(1:5)), wasiIQw1=c(NA,NA,NA,75,9), w1iq=c(44,21,46,75,NA))
    > 
    > dat
      nidaid wasiIQw1 w1iq
    1     H1       NA   44
    2     H2       NA   21
    3     H3       NA   46
    4     H4       75   75
    5     H5        9   NA
    

    创建一个名为new 的新列以将两者结合起来。有了这个ifelse 语句,我们说如果第一列wasiIQw1 不是(!)一个'NA'(is.na()),那么抓住它,否则抓住第二列。与 Ronak 的回答类似,您可以在此处切换列名,以提供一种优先于另一种的偏好。

    > dat$new<-ifelse(!is.na(dat$wasiIQw1), dat$wasiIQw1, dat$w1iq)
    > 
    > dat
      nidaid wasiIQw1 w1iq new
    1     H1       NA   44  44
    2     H2       NA   21  21
    3     H3       NA   46  46
    4     H4       75   75  75
    5     H5        9   NA   9
    

    【讨论】:

      【解决方案3】:

      使用base R,我们可以做到

       gadd.us$w1iq <- with(gadd.us, pmax(w1iq, wasiIQw1, na.rm = TRUE))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 2017-06-24
        • 2012-03-20
        • 1970-01-01
        • 2019-01-07
        相关资源
        最近更新 更多