R data.frame列表

Bac*_*ter 23 r dataframe

我有一个列表列表,称之为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)

  • 我能做些什么来保存类型吗?按照这种方法,如果一列是'POSIXct`,它将它转换为`chr`. (4认同)

lco*_*rag 13

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

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

tl;dr:使用以下内容:

当 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

  • 当“行”被命名为列表时,这非常有用,因为它保留了列表的名称(假设名称一致) (3认同)

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)

  • 这不是列表的列表。这是一个原子向量列表(由于有不同的数据类型,因此强制转换为字符)。 (3认同)

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)