繁体   English   中英

R 列表到 data.frame

[英]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

我不断提出这个问题,通常最终会根据我的需要调整当前的答案。

当前的答案要么与变量类型混淆,要么不能很好地处理正确的列表列表(注意复数)。

tl; dr:使用以下内容:

当 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM