Как выбрать совпадающие строки из двух фреймов данных в r - PullRequest
1 голос
/ 15 марта 2019
> df1
     n1 mt1
1  Mike  48
2  John  64
3 Steve  32
4   Dan  87

> df2
       n1 mt1
1   Peter  32
2   Chris  23
3 Brendan  44
4  Joseph  52

Я бы хотел выбрать строку 1 из df1 и df2.Строка 2 из df1 и df2.Строка 3 из df1 и df2.Ряд 4 от df1 и df2.Я могу сделать это с помощью приведенного ниже кода, но интересно, есть ли более простой способ сделать это, когда есть сотни строк?Я всегда ищу совпадающие строки в обоих df и хотел бы, чтобы они были в паре.

> m1 <- rbind(df1[1,], df2[1,])
> m2 <- rbind(df1[2,], df2[2,])
> m3 <- rbind(df1[3,], df2[3,])
> m4 <- rbind(df1[4,], df2[4,])

> m1
     n1 mt1
1  Mike  48
2 Peter  32

> m2
      n1 mt1
2   John  64
21 Chris  23

> m3
        n1 mt1
3    Steve  32
31 Brendan  44

> m4
       n1 mt1
4     Dan  87
41 Joseph  52

Ответы [ 3 ]

3 голосов
/ 15 марта 2019

Мы можем использовать Map из базы R и создать последовательность индекса строки для подмножеств df1 и df2 и rbind их. Однако убедитесь, что у вас есть одинаковое количество строк для df1, а также df2, иначе вы можете получить неожиданный результат.

Map(function(x, y) rbind(df1[x, ], df2[x, ]), 1:nrow(df1), 1:nrow(df2))

#[[1]]
#      n1 mt1
#1   Mike  48
#11 Peter  32

#[[2]]
#      n1 mt1
#2   John  64
#21 Chris  23

#[[3]]
#        n1 mt1
#3    Steve  32
#31 Brendan  44

#[[4]]
#       n1 mt1
#4     Dan  87
#41 Joseph  52

Мы также можем split каждую строку в списке фреймов данных, а затем rbind

Map(rbind, split(df1, 1:nrow(df1)), split(df2, 1:nrow(df2)))

чья версия purrr будет

purrr::map2(split(df1, 1:nrow(df1)), split(df2, 1:nrow(df2)), rbind)

Поскольку количество строк одинаковое, мы также можем использовать lapply

lapply(1:nrow(df1), function(x) rbind(df1[x, ], df2[x, ]))
2 голосов
/ 15 марта 2019

Делай с split

df=rbind(df1,df2)
split(df,rep((seq.int(nrow(df1))),2)) # or split(df,c(seq.int(nrow(df1)),seq.int(nrow(df2))))
$`1`
      n1 mt1
1   Mike  48
11 Peter  32

$`2`
      n1 mt1
2   John  64
21 Chris  23

$`3`
        n1 mt1
3    Steve  32
31 Brendan  44

$`4`
       n1 mt1
4     Dan  87
41 Joseph  52
0 голосов
/ 15 марта 2019

Другим интуитивным способом сделать это было бы с помощью for loop

df1 <- data.frame(n1=c('Mike','John','Steve','Dan'),
                  mt1=c(48,64,32,87), stringsAsFactors = F)
df2 <- data.frame(n1=c('Peter','Chris','Brendan','Joseph'),
                  mt1=c(32,23,44,52), stringsAsFactors = F)
for (i in 1:nrow(df1)) {
  assign(paste0("m", i), rbind(df1[i, ], df2[i, ]))
}

. Это создаст несколько новых фреймов данных, в данном случае m1, m2, m3 и m4, каждый из которых имеетсоответствующие строки из df1 и df2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...