[英]R list of lists to data.frame
我有一个列表列表,称为listHolder
,长度为 5。
listHolder
中的每个元素都是一个数字数据列表, 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 个小项目。
正如前面提到的@dimitris_ps,答案可能是:
do.call(rbind, listHolder)
由于do.call自然而然地“剥离”了“列表列表”的 1 级,获取的是列表,而不是列表列表。
之后, rbind可以处理列表中的元素并创建一个matrix 。
nrow 的值需要固定。 我修复了你的代码如下:
dd <- as.data.frame(matrix(unlist(listHolder), nrow=length(unlist(listHolder[1]))))
这实现了类似的结果,但更直观(至少对我而言)
#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
这是我找到的最简单的解决方案。
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
我不断提出这个问题,通常最终会根据我的需要调整当前的答案。
当前的答案要么与变量类型混淆,要么不能很好地处理正确的列表列表(注意复数)。
当 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)
我认为这比以前的解决方案更容易:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.