R仅将数据帧保留在列表列表中

时间:2018-02-28 17:02:56

标签: r list dataframe

我从R开始,所以我并不擅长为我的问题搜索相关答案。如果有人提出类似的问题,我很抱歉。

我有一个由数据框和列表组成的列表。 我想知道如何只保留数据帧,以便我可以将它们绑定在一起以产生巨大的数据帧。

这里我举个例子:

 L1 <- list(c(1, "abc", 3))
 L2 <- list(c("b","d"))
 L3 <- list(L1,L2)
 brand <-  c("A","B","C","D")
 price <-  c(1,1,3,7)
 df <- data.frame(brand , price)
 brand2 <-  c("E","F","G","H")
 price2 <-  c(20,3,5,10)
 df2 <-  data.frame(brand2, price2)
 L4 <- list(df, L3, df2)

 finaldf <- do.call("rbind.fill", L4)

不幸的是我遇到了这个错误:错误:rbind.fill的所有输入都必须是data.frames

所以我知道问题是列表L4中有一个列表。在我的真实数据中,大名单中甚至有几个列表。那么有谁能告诉我如何摆脱大名单中的这些列表?非常感谢你!

2 个答案:

答案 0 :(得分:1)

您需要过滤掉哪些列表条目不是data.frames,如下所示:

is_df <- sapply(L4, is.data.frame)

finaldf <- do.call("rbind.fill", L4[is_df])

Alterntatively,

do.call("rbind.fill", Filter(is.data.frame, L4))

答案 1 :(得分:0)

您可以创建索引以对列表进行子集,如下所示:

# Subset list
index <- sapply(L4, is.data.frame)

然后使用它来制作你的最终data.frame:

finaldf <- do.call("rbind", L4[index])

请记住,为了使其工作,两个数据帧必须具有相同的列名,因此在创建df2时,应指定列名称,如下所示:

df2 <-  data.frame(brand = brand2, price = price)

......在你做上述事之前。