【问题标题】:How can I make the output more elegant when I splitting the data.frame in the list?拆分列表中的 data.frame 时,如何使输出更优雅?
【发布时间】:2016-11-04 10:24:38
【问题描述】:

我在列表中有 data.frame 对象,我打算将它们按最后一列拆分。但是,我尝试使用 split 函数来执行此任务,现在每个 data.frame 都有相应的两个子集。我的下一个尝试是只过滤掉每个子data.frame的名称,而其余的data.frame可以由函数返回,更准确地说,是从嵌套列表中过滤掉保存的data.frame作为返回的输出。谁能帮助我如何以更舒适的方式促进这项任务?我可能会采取哪些行动?有什么方法可以使输出得到很好的表现?提前致谢

快速重现示例:

dfList <- list(hola= data.frame( start=seq(1, by=4, len=15), to=seq(3, by=4, len=15), value=sample(30, 15)),
               boo = data.frame( start=seq(3, by=7, len=20), to=seq(6, by=7, len=20), value=sample(30, 20)),
               meh = data.frame( start=seq(4, by=8, len=25), to=seq(7, by=8, len=25), value=sample(30, 25)))

我尝试实现如下功能:

splitMe <- function(list, ...) {
  # check input
  rslt <- lapply(list, function(x) {
    out <- split(x, ifelse(x$value >= 10, "save", "discard"))
    # intend to filter out discard data.frame and export it as csv file 
    # How Can I make this happen
    # while I intend to only return save data.frame from each as output of splitMe
  })
}

关于我的功能的骨架,我怎样才能使它完整?我怎样才能更有效地获得我想要的输出?任何想法都值得赞赏。

【问题讨论】:

  • 我觉得不错,或许你可以把ifelse改成lapply(dfList, function(x) setNames(split(x, x$value &gt;=10), c('discard', 'save')))

标签: r dataframe split


【解决方案1】:

这是一个函数:

splitMe <- function(list, filename, path, threshold...) {
  out <- lapply(list, subset, value>=threshold)
  csv <- lapply(list, subset, value<threshold)
  mapply(function(x, y) write.csv(x, paste0(path, filename, "_", y, ".csv")), csv, c(1:length(list)))
  return(out)
  }

您将filename 的“testfile”和path 的“C:/DiscardedData/”以“testfile”的形式放入您的列表和字符串。

这样你丢弃的数据将被保存为testfile_1.csv、testfile_2.csv等等。

编辑:设置一个阈值,使其更具动态性。只需在函数调用中定义阈值即可。

另一个编辑:要使用该功能,只需调用 ouput &lt;- splitMe(dfList, filename = "discarded", path = "yourpath", threshold = 10) 之类的东西并将您的路径插入为 yourpath

【讨论】:

  • 好吧,你可以使用类似 `split = threshold, 1, 2))) 的东西,但是将再次在您的列表中留下两个 data.frames 的嵌套列表,然后您需要再次打破它,可能使用另一个应用构造。在我看来,使用两个 lapply-calls 是最简单的。
  • 不是在函数中使用 lapply 两次,有没有机会更优雅地收紧拆分 data.frame ?谢谢
  • split &lt;- lapply(list, function(x) split(x, ifelse(x$value &gt;= threshold, 1, 2))) 抱歉,找不到编辑我的评论的选项。
  • 您还可以在函数调用中定义value 参数,使用function(list, filename, path, threshold, value) 使您在使用该函数时更加动态。
  • 我还是不明白为什么在你的答案中使用文件名参数?我可以使用 dir.create("~/") 来设置路径。有没有机会让代码更兼容?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
  • 2014-08-18
  • 1970-01-01
相关资源
最近更新 更多