从R中具有不同列和长度的两个数据框中选择并合并行

时间:2019-02-25 10:47:19

标签: r dataframe select

我有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 

能帮我吗?哪个功能正在执行此操作?

提前谢谢

2 个答案:

答案 0 :(得分:0)

首先只是为了使您的示例更容易重现,很高兴包含这样的数据:

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

答案 1 :(得分:0)

如果我理解正确,OP将请求在关键列df1df2V1上将V2V3正确加入。结果将由df2 all 行和列V4组成,并且 V5df1附加到键匹配的地方。

一种可能的实施方式是使用

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)