2017-05-15 7 views
1

Ich habe zwei Listen, die beide ähnliche Datensätze enthalten, die verschiedenen Jahren entsprechen. Ich möchte die Datensätze in beiden Listen Element für Element zusammenführen. Wenn ich mapply neben dplyr::full_join in dem Fall verwende, in dem die Variablennamen nicht übereinstimmen und ich das Argument by verwenden muss, kann R den Join nicht ausführen. JedochMap() und dplyr Joins

library(dplyr) 
set.seed(100) 

first_list <- list(data.frame(x = 1:3, y = rnorm(3)), 
        data.frame(x = 4:6, y = rnorm(3))) 

second_list <- list(data.frame(z = 1:3, w = rnorm(3)), 
        data.frame(z = 4:6, w = rnorm(3))) 

Map(full_join, by = c("x" = "z"), first_list, second_list) 
#Error: 'z' column not found in rhs, cannot join 

,

Map(function(x, y) full_join(x, y, by = c("x" = "z")), first_list, second_list) 

Arbeiten erfolgreich. Ich bin neugierig auf dieses Verhalten und frage mich, ob jemand eine Erklärung liefern könnte.

+0

Die dplyr Familie von Paketen schreibt map, mapply, et al (wie map, map2 und andere, glaube ich). Wenn Sie diese wirklich verwenden möchten, sollten Sie sich die für Listen definierte "Grammatik" hadley näher ansehen: https://github.com/tidyverse/purrr – Frank

Antwort

2

Da Map ist ein Wrapper zu mapply, verwenden Sie seine MoreArgs Argument, während die anderen erforderlichen args (...) Listen enthalten vektorisiert über (siehe ?mapply) zu:

test1 <- Map(full_join, first_list, second_list, MoreArgs=list(by = c("x" = "z"))) 

test2 <- Map(function(x, y) full_join(x, y, by = c("x" = "z")), first_list, second_list) 

all.equal(test1, test2) 
# [1] TRUE