2016-12-14 1 views
3

Gibt es eine "saubere" Möglichkeit, einer Liste von data.frames (a la full_join(), aber für> 2 data.frames) beizutreten? Ich habe eine Liste von data.frames als Ergebnis eines Anrufs zu map(). Ich habe Reduce() verwendet, um so etwas wie vorher zu tun, aber möchte sie als Teil einer Pipeline zusammenführen - habe einfach keinen eleganten Weg gefunden, das zu tun. Toy Beispiel:Liste der data.frames aus map() aufrufen

library(tidyverse) 

## Function to make a data.frame with an ID column and a random variable column with mean = df_mean 
make.df <- function(df_mean){ 
    data.frame(id = 1:50, 
      x = rnorm(n = 50, mean = df_mean)) 
} 

## What I'd love: 
my.dfs <- map(c(5, 10, 15), make.df) #%>% 
    # <<some magical function that will full_join() on a list of data frames?>> 

## Gives me the result I want, but inelegant 
my.dfs.joined <- full_join(my.dfs[[1]], my.dfs[[2]], by = 'id') %>% 
    full_join(my.dfs[[3]], by = 'id') 

## Kind of what I want, but I want to merge, not bind 
my.dfs.bound <- map(c(5, 10, 15), make.df) %>% 
    bind_cols() 
+1

'purrr erfolgen :: reduce' ist ein Wrapper für' Reduce' mit den Parametern umgekehrt, so dass es besser klingt. – alistaire

+0

Fantastisch - Ich hatte von 'purrr :: reduce' nichts gewusst. Vielen Dank! –

Antwort

1

Wir verwenden Reduce

set.seed(24) 
r1 <- map(c(5, 10, 15), make.df) %>% 
      Reduce(function(...) full_join(..., by = "id"), .) 

Oder dies kann mit reduce

library(purrr) 
set.seed(24) 
r2 <- map(c(5, 10, 15), make.df) %>% 
      reduce(full_join, by = "id") 

identical(r1, r2) 
#[1] TRUE 
Verwandte Themen