15

要素名が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
4

4 に答える 4

20

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行目は、リストをベクトルに変換して非表示にします。

于 2012-09-28T12:07:42.953 に答える
9

使い方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
于 2012-09-28T11:56:12.860 に答える
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
于 2012-09-28T12:02:22.527 に答える