【问题标题】:R keep only data frames in a list of listR 仅在列表列表中保留数据帧
【发布时间】:2018-02-28 17:02:55
【问题描述】:

我从 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 中有一个列表。在我的真实数据中,大名单中甚至还有好几个名单。那么谁能告诉我如何摆脱大列表中的这些列表?非常非常感谢!

【问题讨论】:

  • 澄清一下:您是否只想提取列表中那些属于 data.frame 并忽略向量的项目,然后绑定这些项目?

标签: r list dataframe


【解决方案1】:

您需要像这样过滤掉哪些列表条目不是 data.frames:

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

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

或者,

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

【讨论】:

  • 我认为这里的问题是 OP 可能有一些嵌套在他们仍想提取的列表中的 data.frames,这会使这里的第一条语句失败。
【解决方案2】:

您可以像这样创建索引来对列表进行子集化:

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

然后使用它来制作最终的 data.frame,如下所示:

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

请记住,为了使这两个数据框工作,两个数据框必须具有相同的列名,因此当您创建 df2 时,您应该像这样指定列名:

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

...在您执行上述操作之前。

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2020-03-15
    • 2015-05-16
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多