我有列表,其中元素名稱是ID標籤幷包含帶有數字值的向量。這些長度不相等(!)。將列表轉換爲數據框,同時保留列表元素名稱
我想將其轉換爲數據框,其中一列中有ID,另一列中有數字值。例如爲:
$`1`
[1] 1 2
$`2`
[1] 1 2 3
$`3`
[1] 1
到:
ID Obs
1 1
1 2
2 1
2 2
2 3
3 1
我有列表,其中元素名稱是ID標籤幷包含帶有數字值的向量。這些長度不相等(!)。將列表轉換爲數據框,同時保留列表元素名稱
我想將其轉換爲數據框,其中一列中有ID,另一列中有數字值。例如爲:
$`1`
[1] 1 2
$`2`
[1] 1 2 3
$`3`
[1] 1
到:
ID Obs
1 1
1 2
2 1
2 2
2 3
3 1
這裏有一種方法:
## 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()
列出所需的次數。第二行只是列出了將它轉換爲矢量的列表。
使用reshape2
和melt
其具有方法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
使用基函數的溶液
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
我覺得你可以做'X < - 選擇不公開(名單)'不能您? –
@Gavin Simpson你說得對,現在我已經編輯了我的答案,包括你的評論。 –
這似乎是當我沒有列出它添加一個數字元素名稱導致其餘的腳本失敗,我的目的:S –
好和人仍下落不明替代已發佈的解決方案是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)
我給你正確的答案,因爲你的方法是最快的:
> 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
–
我似乎不能添加換行符,對於混亂抱歉:S –