【问题标题】:Select and combine rows from two data frames with different columns and lenght in R从 R 中具有不同列和长度的两个数据帧中选择并组合行
【发布时间】:2019-02-25 10:47:18
【问题描述】:

我有 2 个数据框。 df1 就像

V1    V2    V3   V4        V5
1   1  7506 10949    3 0.2284710
2   1 28272 29965  147 0.6033058
3   1 36598 37518  843 0.7459016
4   1 37512 40365   52 0.4121901
5   1 48795 50666  150 0.8050847
6   1 50660 52365   92 0.6995614
7   1 52850 54453 1337 0.8991597
8   1 54447 54527  279 0.9858824
9   1 54816 64015    2 0.2787356
10  1 70664 74349   17 0.5549451

df2 是这样的:

1     1     1  7512
2     1  7506 10949
3     1 10943 13175
4     1 13169 20070
5     1 20064 28278
6     1 28272 29965
7     1 29959 36604
8     1 36598 37518
9     1 37512 40365
10    1 40359 48801

我想将它们组合到一个新的 df3 中,如果匹配,它将采用 df1$V4 和 df1$V5 的值,如果没有,它将是 NA 或 0。最终的数据帧应该像:

 1     1  7512    0 0
 1  7506 10949    3 0.2284710
 1 10943 13175    0 0
 1 13169 20070    0 0
 1 20064 28278    0 0
 1 28272 29965  147 0.6033058
 1 29959 36604    0 0
 1 36598 37518  843 0.7459016
 1 37512 40365   52 0.4121901
 1 40359 48801    0 0
 ......
 ......
 etc until the end of the files 

你能帮帮我吗?哪个函数在做这个?

提前谢谢你

【问题讨论】:

    标签: r dataframe select


    【解决方案1】:

    首先,为了更容易重现您的示例,最好包含您的数据,如下所示:

    df1 <- structure(list(V1 = 1:10, V2 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
    1L, 1L, 1L), V3 = c(7506L, 28272L, 36598L, 37512L, 48795L, 50660L,
    52850L, 54447L, 54816L, 70664L), V4 = c(10949L, 29965L, 37518L,
    40365L, 50666L, 52365L, 54453L, 54527L, 64015L, 74349L), V5 = c(3L,
    147L, 843L, 52L, 150L, 92L, 1337L, 279L, 2L, 17L), V6 = c(0.228471,
    0.6033058, 0.7459016, 0.4121901, 0.8050847, 0.6995614, 0.8991597,
    0.9858824, 0.2787356, 0.5549451)), class = "data.frame", row.names = c(NA,
    -10L))
    
    
    df2 <- structure(list(V1 = 1:10, V2 = c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
    1L, 1L, 1L), V3 = c(1L, 7506L, 10943L, 13169L, 20064L, 28272L,
    29959L, 36598L, 37512L, 40359L), V4 = c(7512L, 10949L, 13175L,
    20070L, 28278L, 29965L, 36604L, 37518L, 40365L, 48801L)), class = "data.frame", row.names = c(NA,
    -10L))
    

    然后使用每个数据集中的两个键生成索引并匹配位置

    index <- match(paste0(df2$V3, df2$V4), paste0(df1$V3, df1$V4))
    

    然后使用该索引填充第二个数据框中的值:

    df2$V5 <- df1$V5[index]
    df2$V6 <- df1$V6[index]
    

    当然,您的数据中可能有不同的列名,因为我只是快速复制/粘贴了您的数据并获得了行名和其他内容。

    df2
    
       V1 V2    V3    V4  V5        V6
    1   1  1     1  7512  NA        NA
    2   2  1  7506 10949   3 0.2284710
    3   3  1 10943 13175  NA        NA
    4   4  1 13169 20070  NA        NA
    5   5  1 20064 28278  NA        NA
    6   6  1 28272 29965 147 0.6033058
    7   7  1 29959 36604  NA        NA
    8   8  1 36598 37518 843 0.7459016
    9   9  1 37512 40365  52 0.4121901
    10 10  1 40359 48801  NA        NA
    

    【讨论】:

    • 问题是这是我的文件样本。每个数据框不仅包含 10 行,还包含更多行。那么我将如何像上面的列表那样重现它?
    • 就像上面一样 :) 您可以在数据框中拥有任意数量的行。只需检查您的列名称是否与我写的内容一致。
    【解决方案2】:

    如果我理解正确,OP 请求在 V1V2V3 的关键列上正确加入 df1df2。结果将包含 所有df2 和列 V4V5 附加自 df1 键匹配的位置。

    一种可能的实现是使用

    library(data.table)
    setDT(df1)[setDT(df2), on = .(V1, V2, V3)]
    
        V1    V2    V3  V4        V5
     1:  1     1  7512  NA        NA
     2:  1  7506 10949   3 0.2284710
     3:  1 10943 13175  NA        NA
     4:  1 13169 20070  NA        NA
     5:  1 20064 28278  NA        NA
     6:  1 28272 29965 147 0.6033058
     7:  1 29959 36604  NA        NA
     8:  1 36598 37518 843 0.7459016
     9:  1 37512 40365  52 0.4121901
    10:  1 40359 48801  NA        NA
    

    数据

    library(data.table)
    df1 <- fread("rn V1    V2    V3   V4        V5
    1   1  7506 10949    3 0.2284710
    2   1 28272 29965  147 0.6033058
    3   1 36598 37518  843 0.7459016
    4   1 37512 40365   52 0.4121901
    5   1 48795 50666  150 0.8050847
    6   1 50660 52365   92 0.6995614
    7   1 52850 54453 1337 0.8991597
    8   1 54447 54527  279 0.9858824
    9   1 54816 64015    2 0.2787356
    10  1 70664 74349   17 0.5549451", drop = 1L)
    df2 <- fread("rn V1    V2    V3
    1     1     1  7512
    2     1  7506 10949
    3     1 10943 13175
    4     1 13169 20070
    5     1 20064 28278
    6     1 28272 29965
    7     1 29959 36604
    8     1 36598 37518
    9     1 37512 40365
    10    1 40359 48801", drop = 1L)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2021-07-19
      • 2018-03-23
      • 2016-09-04
      相关资源
      最近更新 更多