如何在R中将嵌套列表转换为数据框?

4
我有一个嵌套列表,想要将其转换为数据框。
iter1 <- list(item1 = 1, item2 = "a")
iter2 <- list(item1 = 1, item2 = "b")
All <- list(iter1 = iter1, iter2 = iter2)

df <- data.frame(t(sapply(All,c))) # Convert list to dataframe

但我的问题是,df$iter1 返回的是一个列表而不是数据框,有什么想法吗?
> class(df)
[1] "data.frame"

> df$item1
$iter1
[1] 1

$iter2
[1] 1

使用do.call转换时,我遇到了同样的问题:df <- data.frame(do.call(rbind, All)),但我无法弄清楚问题出在哪里。


df$iter1 无法返回一个 data.frame!data.frame 的项可以是向量或列表。顺便说一下,df 是一个数据框,但它的项是列表而不是向量。假设您希望它们分别成为数字和字符值的向量? - Serhat Cevikel
3个回答

3
temp = unique(unlist(lapply(All, names)))
mydf = setNames(object = data.frame(lapply(temp, function(nm)
    unlist(lapply(All, function(x) x[[nm]])))), nm = temp)

mydf
#      item1 item2
#iter1     1     a
#iter2     1     b

或者

do.call(rbind, lapply(All, data.frame))
#      item1 item2
#iter1     1     a
#iter2     1     b

或者

data.table::rbindlist(All, idcol = TRUE)
#     .id item1 item2
#1: iter1     1     a
#2: iter2     1     b

1
对于最后一个:@d.b的方法非常完美!如果需要,as.data.frame(data.table::rbindlist(All, idcol = TRUE))可以将其转换为数据框。 - Serhat Cevikel

1
会做你想要的吗?
iter1 <- list(item1 = 1, item2 = "a")
iter2 <- list(item1 = 1, item2 = "b")
All <- list(iter1 = iter1, iter2 = iter2)

然后:

df <- as.data.frame(lapply(All, unlist))

> str(df)
'data.frame':   2 obs. of  2 variables:
 $ iter1: Factor w/ 2 levels "1","a": 1 2
 $ iter2: Factor w/ 2 levels "1","b": 1 2

它们是因子。如果您提供stringsAsFactors = F,则它们都会被强制转换为字符。我认为第一列应该是数字(1,1),第二列是字符(a,b)? - Serhat Cevikel
你可以转置并将该列变为数字吗? - user3375672
我想要的是一个数据框,这样df$item1就会返回一个带有item1列的数据框。 - Florent
那是一种方法,但不是 R 的方式。如果有 100 列会怎样呢? - Serhat Cevikel
@SerhatCevikel:当然,不是非常通用。 - user3375672

0

我认为您希望第一列是一个数值向量,如1,1,而第二列是一个字符向量,如"a"和"b"?

这样怎么样:

iter1 <- list(item1 = 1, item2 = "a")
iter2 <- list(item1 = 1, item2 = "b")
All <- list(iter1 = iter1, iter2 = iter2)

extract <- function(x, listx) sapply(listx, "[[", x)

df <- lapply(1:2, extract, All)
df <- as.data.frame(df, col.names = names(All), stringsAsFactors = F)
df

如果你想要一行代码:

df <- as.data.frame(lapply(1:2, function(x, listx) sapply(listx, "[[", x), All), col.names = names(All), stringsAsFactors = F)
df

你有iter1和iter2作为列和行名称,但我猜它们只属于行,而列应该有item1和item2。 - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接