要素名が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
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()
2行目は、リストをベクトルに変換して非表示にします。
使い方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