2017-08-30 25 views
2

我有這樣的事情:加入兩個列表中的R由ID

ids <- c("A","B","C") 
ls <- list() 
ls[[1]] <- c("aa","aaa") 
ls[[2]] <- c("bb","bbb") 
ls[[3]] <- c("cc","ccc") 

,我想獲得的東西喜歡下:

data.frame(ids = c("A","A","B","B","C","C"), ls = c("aa","aaa","bb","bbb","cc","ccc")) 

你會知道該怎麼辦呢? ls的每個元素的長度可能會有所不同,但ids和ls的長度是相同的。 Dplyr和purrr(tidyverse)是好的,我

最佳

回答

3

最簡單的基礎R的方法是使用unlistrep這樣的:

data.frame(ids=rep(ids, lengths(ls)), ls=unlist(ls)) 
    ids ls 
1 A aa 
2 A aaa 
3 B bb 
4 B bbb 
5 C cc 
6 C ccc 

rep重複的ID與由lengths計算每個列表元素的長度變化的長度。然後,將嵌套列表轉換爲帶有unlist的矢量。

1

喜歡這個?

library(tidyr) 
gather(data.frame(setNames(ls, ids)), ids, ls) 
    ids ls 
1 A aa 
2 A aaa 
3 B bb 
4 B bbb 
5 C cc 
6 C ccc 

這個工作在以下方式:第一,我給你的名字的列表:

named_list <- setNames(ls, ids) 
named_list 
$A 
[1] "aa" "aaa" 
$B 
[1] "bb" "bbb" 
$C 
[1] "cc" "ccc" 

然後將其轉換成數據幀:

test_df <- data.frame(named_list) 
test_df 
    A B C 
1 aa bb cc 
2 aaa bbb ccc 

然後我重新塑造它使用tidyr::gatherreshape2::melt

gather(test_df) 
    key value 
1 A aa 
2 A aaa 
3 B bb 
4 B bbb 
5 C cc 
6 C ccc 

要提供您的列名稱,只需像上面那樣添加idsls

1

這裏是base R

setNames(stack(setNames(ls, LETTERS[1:3]))[2:1], c("ids", "ls")) 
# ids ls 
#1 A aa 
#2 A aaa 
#3 B bb 
#4 B bbb 
#5 C cc 
#6 C ccc 
一個選項