R data.frame列表

时间:2015-04-16 12:25:07

标签: r dataframe

我有一个列表列表,称之为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个小项目。

6 个答案:

答案 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)

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

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

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)

答案 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