有什么方法可以简化嵌套列表中的data.frame以便于操作?

时间:2017-01-12 12:12:03

标签: r dataframe data.table

我需要使用阈值评估列表中的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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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()

答案 2 :(得分:0)

如果我继续@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可以更加轻松高效。