2012-09-28 84 views

回答

13

這裏有一種方法:

## your list 
ll <- list("1" = 1:2, "2" = 1:3, "3" = 1:2) 
## convert to data.frame 
dl <- data.frame(ID = rep(names(ll), sapply(ll, length)), 
       Obs = unlist(ll)) 

這給:

> dl 
    ID Obs 
11 1 1 
12 1 2 
21 2 1 
22 2 2 
23 2 3 
31 3 1 
32 3 2 

data.frame()調用第一行只是一些代碼重複的的names()列出所需的次數。第二行只是列出了將它轉換爲矢量的列表。

+0

我給你正確的答案,因爲你的方法是最快的:
> system.time(melt(X))
user系統經過
3.12 0.11 3.24
> system.time(data.frame(ID =代表(姓名(X),sapply(X,長度)), 觀測值=不公開(X)))
用戶系統經過
0.08 0.00 0.07

+0

我似乎不能添加換行符,對於混亂抱歉:S –

6

使用reshape2melt其具有方法melt.list

.list <- list(`1` = 1:2, `2` = 1:3, `3` = 1:2) 
library(reshape2) 
melt(.list) 
## value L1 
## 1  1 1 
## 2  2 1 
## 3  1 2 
## 4  2 2 
## 5  3 2 
## 6  1 3 
## 7  2 3 
1

使用基函數的溶液

List <- list('1'=c(1,2), '2'= c(1,2,3), '3'=1) 
x <- unlist(List) # as suggested by Gavin Simpson 
data.frame(ID=substr(names(x),1,1), Obs=x) 
    ID Obs 
11 1 1 
12 1 2 
21 2 1 
22 2 2 
23 2 3 
3 3 1 

如果您希望rownames是1,2,3,4,5,6試試這個(使用setNames):

data.frame(ID=substr(names(x),1,1), Obs=setNames(x, NULL)) 
    ID Obs 
1 1 1 
2 1 2 
3 2 1 
4 2 2 
5 2 3 
6 3 1 

該解決方案是有效的只有當所有的名字有相同的長度,否則」會失敗,並且最好使用Gavin的解決方案。例如見:

List2 <- list('week1'=c(1,2), 'week2'= c(1,2,3), 'week3'=1) 
x <- unlist(List2) 
data.frame(ID=substr(names(x),1,nchar(names(x)[1])-1), Obs=setNames(x, NULL)) 

    ID Obs 
1 week1 1 
2 week1 2 
3 week2 1 
4 week2 2 
5 week2 3 
6 week3 1 
+0

我覺得你可以做'X < - 選擇不公開(名單)'不能您? –

+0

@Gavin Simpson你說得對,現在我已經編輯了我的答案,包括你的評論。 –

+0

這似乎是當我沒有列出它添加一個數字元素名稱導致其餘的腳本失敗,我的目的:S –

1

好和人仍下落不明替代已發佈的解決方案是stack -function:

df <- stack(ll)[2:1] 

這給:

> df 
    ind values 
1 1  1 
2 1  2 
3 2  1 
4 2  2 
5 2  3 
6 3  1 
7 3  2 

使用setNames爲好,你可以得到確切的想要的格式:

df <- setNames(stack(ll)[2:1], c('ID','Obs')) 

這給:

> df 
    ID Obs 
1 1 1 
2 1 2 
3 2 1 
4 2 2 
5 2 3 
6 3 1 
7 3 2 

使用的數據:

ll <- list("1" = 1:2, "2" = 1:3, "3" = 1:2) 
相關問題