ego*_*go_ 11 r list dataframe r-faq
我有列表,其中元素名称是ID标签,并包含带有数值的向量.这些是不相等的(!)长度.
我想将其转换为数据框,其中我在一列中具有ID,在另一列中具有数值.例如:
$`1`
[1] 1 2
$`2`
[1] 1 2 3
$`3`
[1] 1
Run Code Online (Sandbox Code Playgroud)
至:
ID Obs
1 1
1 2
2 1
2 2
2 3
3 1
Run Code Online (Sandbox Code Playgroud)
Rei*_*son 17
这是一种方式:
## 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))
Run Code Online (Sandbox Code Playgroud)
这给出了:
> dl
ID Obs
11 1 1
12 1 2
21 2 1
22 2 2
23 2 3
31 3 1
32 3 2
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
已经发布的解决方案的一个很好但仍然缺少的替代方案是 -function stack:
df <- stack(ll)[2:1]
Run Code Online (Sandbox Code Playgroud)
这使:
Run Code Online (Sandbox Code Playgroud)> 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'))
Run Code Online (Sandbox Code Playgroud)
这使:
Run Code Online (Sandbox Code Playgroud)> 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9974 次 |
| 最近记录: |