2017-11-08 16 views
8

Giả sử tôi có N danh sách tất cả đều có cùng tên cột. Tôi muốn kết hợp những thứ như vậy mà tôi nhận được một danh sách kết quả với cùng một cột, nhưng bây giờ có chứa các mục từ tất cả các danh sách N. Dưới đây là một MWe cho thấy những gì tôi muốn:Làm cách nào để hợp nhất các danh sách với các tên cột giống hệt nhau để có được công đoàn của họ

ls<-list() 
ls[[1]]<-list("a"=1, 
       "b"=2) 
    ls[[2]]<-list("a"=3, 
        "b"=4) 

#how to write a one-liner that produces lsTotal, which is the union of ls[[1]] and ls[[2]]? 

lsTotal<-list("a"=c(1,3), 
       "b"=c(2,4)) 

tôi thấy thread này, từ đó tôi có thể sử dụng Map(c, ls[[1]], ls[[2]]). Tuy nhiên, viết ra là tẻ nhạt nếu ls là rất dài. Có lối tắt nào không?

+1

Lưu ý rằng ít gõ để xây dựng danh sách ví dụ của bạn trong một dòng: 'ls <- list (danh sách (a = 1, b = 2), danh sách (a = 3 , b = 4)) '. – lmo

+0

Các phần tử trong danh sách con có luôn theo thứ tự không? –

Trả lời

7

Một lựa chọn là tidyverse

library(purrr) 
library(dplyr) 
transpose(ls) %>% 
     map(unlist) 

Hoặc sử dụng Map với do.call

do.call(Map, c(f=c, ls)) 
#$a 
#[1] 1 3 

#$b 
#[1] 2 4 
3

Đây là một đơn giản hai lót với unlistsplit.

# get a named vector 
tmp <- unlist(ls) 

# split on the names 
split(unname(tmp), names(tmp)) 
$a 
[1] 1 3 

$b 
[1] 2 4 
2

Tôi biết câu hỏi này đã có một vài câu trả lời nhưng tùy chọn khác là sử dụng Reduce với Map của bạn để áp dụng các Map cho mỗi yếu tố liên tiếp trong danh sách:

Reduce(function(x,y) Map(c,x,y), ls) 
#$a 
#[1] 1 3 

#$b 
#[1] 2 4 

Hoặc cho một ví dụ phức tạp hơn, kết quả là:

ls <- list(list(a=1, b=2), list(a=3, b=4), list(a=2,b=4), list(a=5,b=2), list(a=3,b=2)) 

#$a 
#[1] 1 3 2 5 3 

#$b 
#[1] 2 4 4 2 2 
Các vấn đề liên quan