我有一个列表列表,称之为listHolder长度为5的列表.
每个元素listHolder都是一个数字数据列表,包含160个左右的元素.
我需要将这个列表列表转换data.frame为长度为5 的列表,每个元素都是一个包含160个左右元素的数字向量.
但是我尝试过的一切,从遍历列表列表并将每个元素as.numeric(unlist(listHolder[[i]]))转换为
data.frame(matrix(unlist(listHolder), nrow = length(totalKeywords), byrow = T))
Run Code Online (Sandbox Code Playgroud)
最终创建一个长度为160左右的数据帧,每个元素都是一个带有5个左右元素的数字向量.
我该怎么做我想要的?
尝试data.frame(matrix(unlist(totalKeywords), nrow=132, byrow=T))产生与我想要的相反 - 每个5个元素长的160个小项目.
Noh*_*nce 28
nrow的值需要修复.我修改了你的代码如下:
dd <- as.data.frame(matrix(unlist(listHolder), nrow=length(unlist(listHolder[1]))))
Run Code Online (Sandbox Code Playgroud)
lco*_*rag 13
我不断地提出这个问题,通常最终会根据我的需要调整当前的答案。
当前的答案要么弄乱了变量的类型,要么不能很好地处理正确的列表列表(注意复数)。
当 listHolder 中的每个元素包含数据帧的一列时,此方法有效
df <- data.frame(lapply(listHolder, function(x) Reduce(c, x)))
Run Code Online (Sandbox Code Playgroud)
当 listHolder 中的每个元素包含数据帧的一行时,此方法有效
df <- do.call(rbind, lapply(listHolder, data.frame))
Run Code Online (Sandbox Code Playgroud)
以下代码提供了 MWE 并回顾了其他答案。这#General Approach是我推荐使用的。
listHolder <- list(
A = rep(list(1, 2), 80),
B = rep(c(3, 4), 80),
C = rep(c("a", "b"), 80),
D = rep(list("c", "d"), 80),
E = rep(as.POSIXct(10485849600, origin = "1582-10-14", tz = "GMT"), 160)
)
# @Noha's Answer
data1 <- as.data.frame(matrix(unlist(listHolder), nrow=length(unlist(listHolder[1]))))
# Try this (mess up with types)
str(data1)
# @Camilo's Answer
data2 <- data.frame(do.call(cbind, listHolder))
# Try this (each column becomes a list)
str(data2)
# General Approach
data3 <- data.frame(lapply(listHolder, function(x) Reduce(c, x)))
str(data3)
Run Code Online (Sandbox Code Playgroud)
当列表中的每个元素应该在数据框中保存一行时,应该使用此代码
listHolder <- list(
row1 = list(name = "foo", surname = "bar", age = 90),
row2 = list(name = "foo", surname = "foo", age = 29),
row3 = list(name = "bar", surname = "foo", age = 45),
row4 = list(name = "bar", surname = "bar", age = 10)
)
# A simple rbind won't work (each column is still a list)
data1 <- do.call(rbind, listHolder)
str(data1)
# General Approach (now it's better)
data2 <- do.call(rbind, lapply(listHolder, data.frame))
str(data2)
Run Code Online (Sandbox Code Playgroud)
Cam*_*oud 12
如前面提到的@dimitris_ps,答案可能是:
do.call(rbind, listHolder)
Run Code Online (Sandbox Code Playgroud)
由于do.call自然会“剥离”“列表列表”的1级,因此获得列表而不是列表列表。
之后,rbind可以处理列表中的元素并创建一个matrix。
sea*_*ean 10
这实现了类似的结果,但更直观(至少对我来说)
#Generate fake data
listoflists=list(c(1,'a',3,4),c(5,'b',6,7))
#Convert to a dataframe, transpose, and convert the resulting matrix back to a dataframe
df= as.data.frame(t(as.data.frame(listoflists)))
#Strip out the rownames if desired
rownames(df)<-NULL
#Show result
df
Run Code Online (Sandbox Code Playgroud)
Dav*_*vid 10
这是我找到的最简单的解决方案。
library(jsonlite)
library(purrr)
library(data.table)
dt_list <- map(list_of_lists, as.data.table)
dt <- rbindlist(dt_list, fill = TRUE, idcol = T)
dt
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
46467 次 |
| 最近记录: |