Выберите и объедините строки из двух фреймов данных с разными столбцами и длиной в R - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть 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 голосов
/ 25 февраля 2019

Если я правильно понимаю, OP запрашивает правое присоединение df1 с df2 в ключевых столбцах V1, V2 и V3.Результат будет состоять из всех строк df2 со столбцами V4 и V5 с добавлением 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

Data

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)
0 голосов
/ 25 февраля 2019

Сначала, чтобы упростить воспроизведение вашего примера, было бы удобно включить ваши данные следующим образом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...