R 将列表转换为数据框,同时保留列表元素名称

R 将列表转换为数据框,同时保留列表元素名称,r,list,dataframe,r-faq,R,List,Dataframe,R Faq,我有一个列表,其中ElementName是ID标记,包含一个带有数值的向量。这些长度不等 我想将其转换为一个数据帧,其中一列中有ID,另一列中有数值。例如: $`1` [1] 1 2 $`2` [1] 1 2 3 $`3` [1] 1 致: 使用reformae2和melt这两种方法,它们有一个方法melt.list .list <- list(`1` = 1:2, `2` = 1:3, `3` = 1:2) library(reshape2) melt(.li

我有一个列表,其中ElementName是ID标记,包含一个带有数值的向量。这些长度不等

我想将其转换为一个数据帧,其中一列中有ID,另一列中有数值。例如:

$`1`  
[1] 1 2   
$`2`  
[1] 1 2 3 
$`3`  
[1] 1   
致:


使用
reformae2
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 <- 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
只有当所有名称的长度相同时,此解决方案才有效,否则将失败,最好使用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
List2这里有一种方法:

## 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))

data.frame()
调用中的第一行只是重复列表的
names()
所需次数的代码。第二行只是取消列出将其转换为向量的列表。

除了已发布的解决方案之外,还有一个很好但仍然缺少的替代方案是
堆栈
-函数:

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

还可以使用
setNames
获得所需的确切格式:

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

使用数据:

ll <- list("1" = 1:2, "2" = 1:3, "3" = 1:2)

ll我想你可以做
x@Gavin Simpson你是对的,现在我刚刚编辑了我的答案,包括你的评论。似乎当我取消列出时,它会在元素名称中添加一个数字,导致脚本的其余部分因我的目的而失败:S@Jilber抱歉,现在它将所有名称更改为“2”或“5”。元素名称是由ID.Seasons.Week组成的因子,例如2225.Winter.1,如果有帮助的话。我喜欢在可能的情况下使用基本函数的角度,因此如果这也能起作用那就好了。我给了你正确的答案,因为你的方法是最快的:
系统时间(melt(X))
用户系统运行时间
3.12 0.11 3.24
系统时间(data.frame(ID=rep(name(X),sapply(X,length)),Obs=unlist(X))
用户系统运行时间
0.08 0.00 0.07
我似乎无法添加换行符,很抱歉造成混乱:S
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
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)