我有一个列表列表,称之为listHolder
,其长度为5.
listHolder
中的每个元素都是数字数据列表,包含160个左右的元素。
我需要将此列表列表转换为长度为5的data.frame
,每个元素都是一个包含160个左右元素的数字向量。
但我尝试过的一切,从遍历列表列表并将每个元素转换为as.numeric(unlist(listHolder[[i]]))
到
data.frame(matrix(unlist(listHolder), nrow = length(totalKeywords), byrow = T))
最终创建一个长度为160左右的数据帧,每个元素都是一个带有5个左右元素的数字向量。
我如何做我想做的事?
尝试data.frame(matrix(unlist(totalKeywords), nrow=132, byrow=T))
会产生与我想要的相反的结果 - 每个5个元素长的160个小项目。
答案 0 :(得分:24)
需要修复nrow的值。我修改了你的代码如下:
dd <- as.data.frame(matrix(unlist(listHolder), nrow=length(unlist(listHolder[1]))))
答案 1 :(得分:9)
这实现了类似的结果,但更直观(至少对我而言)
#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
答案 2 :(得分:9)
前面提到的AS @dimitris_ps,答案可能是:
do.call(rbind, listHolder)
由于 do.call 很自然地“剥离”了“列表列表”的1级,所以获得了一个列表,而不是列表列表。
之后, rbind 可以处理列表中的元素并创建矩阵。
答案 3 :(得分:4)
这是我找到的最简单的解决方案。
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
答案 4 :(得分:1)
我不断提出这个问题,通常最终会根据我的需要调整当前的答案。
当前的答案要么与变量类型混淆,要么不能很好地处理列表(注意复数)。
这在 listHolder 中的每个元素都包含数据框的一列时有效
df <- data.frame(lapply(listHolder, function(x) Reduce(c, x)))
这在 listHolder 中的每个元素都包含一行数据框时有效
df <- do.call(rbind, lapply(listHolder, data.frame))
以下代码提供了 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)
当列表中的每个元素都应该在数据框中保存一行时,应该使用此代码
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)
答案 5 :(得分:0)
我认为这比以前的解决方案更容易:
mydf = data.frame(x1 = c('a', 'b', 'c'))
mylist = list(c(4, 5), c(4, 5), c(4, 5))
mydf$x2 = mylist
print(mydf)
x1 x2
1 a 4, 5
2 b 4, 5
3 c 4, 5