【问题标题】:Any way to simplify data.frame in the nested list for ease of manipulation?有什么方法可以简化嵌套列表中的 data.frame 以方便操作?
【发布时间】:2017-01-12 12:12:03
【问题描述】:

我需要用阈值评估列表中的data.frame,打算获取需要导出为csv文件的新组data.frame。但是,在我用给定的阈值对每个 data.frame 进行分类后,结果变成了嵌套列表。也许,我必须将这些生成的嵌套列表作为 data.frame 列表进行操作,然后遍历 data.frame 列表以将它们导出为csv 文件。我使用reshape2 来融化生成的嵌套列表,但不知道如何根据需要对它们进行分组并以所需的方式导出它们。有谁能告诉我更简单的方法来操作嵌套列表来制作 data.frame 列表?我怎样才能做到这一点?有没有什么有效的方法来完成这项工作?非常感谢:)

这是可重现的输入 data.frame 列表:

myList <- list(
    hotan = data.frame( begin=seq(1, by=6, len=25), end=seq(4, by=6, len=25), pos.score=sample(30, 25)),
    aksu = data.frame( begin=seq(3, by=9, len=30), end=seq(6, by=9, len=30), pos.score=sample(45, 30)),
    korla = data.frame( begin=seq(6, by=8, len=45), end=seq(11, by=8, len=45), pos.score=sample(52, 45))
)

我需要使用阈值评估每个 data.frame,这会导致嵌套列表如下:

rslt <- lapply(myList, function(x) {
    res <- split(x, ifelse(x$pos.score >=18, "good","bad"))
})

我尝试使用melt 删除嵌套列表结构:

library(reshape2)
melt(rslt)

也许,首先退出嵌套列表,将rslt 转换为data.frame 列表,然后使用lapply 将每个导出为csv 文件。请问有什么办法吗?

编辑

我知道使用unlist 处理嵌套列表的一般方法,也许data.tabledplyr 提供了更好的功能来处理此类问题。我想学习新的解决方案。谢谢

我正在尝试实现这个 data.frame 列表:

hotan.good
hotan.bad
aksu.good
aksu.bad
korla.good
korla.bad

如何获得需要导出为csv 文件的所需data.frame 列表?我该如何操作 rslt

【问题讨论】:

  • unlist(rslt, recursive = FALSE)
  • @Apom 我知道,我正在寻找有趣的东西。

标签: r dataframe data.table


【解决方案1】:

为什么要使用数据框列表?您可以轻松地将所有数据放在一个数据框中:

library(dplyr)
df = bind_rows(myList, .id="name")
# new Variable threshold
df %>% mutate(threshold = ifelse(pos.score >=18, "good", "bad"))

现在您可以过滤和选择此数据框中的数据(甚至将其拆分为数据框列表。)

【讨论】:

  • @Dan 您可以使用来自 dplyr 的 group_by 或来自 data.table 的 by= 以块的形式评估单个 data.frame 的子集。除非您有一些并行处理计划,并且您知道会胜过这些计划,否则我会说坚持使用单个对象。 (回复消失的评论...)
【解决方案2】:

hotan.good.csvhotan.bad.csvaksu.good.csv、...写入现有的./out/ 文件夹:

library(magrittr)
l <- unlist(rslt, recursive = FALSE)
l %>% 
  names() %>% 
  lapply(FUN = function(f) write.csv(l[[f]], paste0("out/", f, ".csv"), row.names = FALSE)) %>% 
  invisible()

【讨论】:

    【解决方案3】:

    如果我继续 @MarkusN' 解决方案(感谢他的帮助):

    library(dplyr)
    DF <- bind_rows(myList, .id="sample") %>% 
        mutate(threshold = ifelse(pos.score >=18, "good", "bad")) %>%
        split(list(.$threshold,.$sample))
    mapply(write.csv, DF, paste0(getwd(), names(DF), ".csv"))
    

    通过这种方式,在嵌套列表中导出 data.frame 可以更加简单高效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多