【问题标题】:How to efficiently iterate list of data.frame as an input for custom function?如何有效地迭代 data.frame 列表作为自定义函数的输入?
【发布时间】:2016-12-24 10:07:52
【问题描述】:

我有 data.frame 列表作为我的自定义函数的输入,我希望自定义函数返回多个 data.frame 列表。我对我的函数做了一些代码更改,但它返回了意外的输出。谁能建议我如何改进自定义函数中的代码?我的代码哪里出错了?有什么提示吗?

数据

myList <- list(
  foo = data.frame( start=seq(1, by=4, len=6), stop=seq(3, by=4, len=6)),
  bar = data.frame(start=seq(5, by=2, len=7), stop=seq(7, by=2, len=7)),
  bleh = data.frame(start=seq(1, by=5, len=5), stop=seq(3, by=5, len=5))
)

自定义功能需要优化:

func <- function(set) {
  # check input param
  stopifnot(is.list(set))
  output <- list()
  require(dplyr)
  for(id in 1: seq_along(set)) {
    entry <- set[[id]]
    self_ <- setdiff(entry, entry)
    res <- lapply(set[-id], function(ele_) {
      joined_ <- setdiff(entry, ele_)
    })
    ans <- c(list(self_), res)
    names(ans) <- c(names(set[id]),names(set[-id]))
    output[id] <- ans
  }
  return(output)
}

想要的输出

我希望我的自定义函数会返回多个 data.frame 对象列表。谁能给我一些想法?谢谢

【问题讨论】:

  • func 究竟应该做什么?暂时不要管它的输出格式;您要对输入执行什么计算?
  • “总是用列表很无聊”???你这是什么意思?列表有效且灵活。如果这会让你更快乐,你可以给他们起有趣的名字。 “R 中的哪个 data.structure 更适合存储非常大的多个 data.frame 列表” 在基础 R 中,有两种结构可以在其中包含数据框列表:列表和环境。除了无聊,您在使用列表时还有哪些问题?
  • 您的示例不可重现。 “改进的”功能似乎没有做任何事情。我的回答解决了您原始示例的意图。我不能给你比这更具体的答案,因为你的例子是不够的。我们无法读懂你的想法。
  • 我在执行上错了。

标签: r loops functional-programming


【解决方案1】:

我仍然无法理解您的意图,但这里有一个更清洁的解决方案的建议。

首先,将数据存储为平面数据框通常要容易得多:

library(plyr)
df <- ldply(df.list, rbind, .id = 'group1')

   group1 V1 V2
1       a  1  1
2       a  1  0
3       a  1  4
4       a  2  5
...   
18      c  4  3

然后我们可以使用 plyr 循环遍历两组的组合并计算它们的集合差异:

df.setdiff <- ddply(df, .(group1), function(x) {
    comparisons <- subset(df, group1 != x$group1[1])
    colnames(comparisons) <- c('group2', 'V1', 'V2')
    res <- ddply(comparisons, .(group2), function(y) {
        return(setdiff(x[c('V1', 'V2')], y[c('V1', 'V2')]))
    })
})

这会产生一个单一的数据框:

   group1 group2 V1 V2
1       a      b  1  1
2       a      b  1  0
3       a      b  1  4
4       a      b  2  5
5       a      b  3  0
6       a      b  0  2
7       a      c  1  4
8       a      c  2  5
9       a      c  3  0
10      a      c  0  2
...
24      c      b  0  3

一些比较出现两次,因为每个组都可以出现在“group1”或“group2”列中,我的代码不会跳过这些重复,但这应该可以帮助您入门。

【讨论】:

  • 你是对的。我在执行上确实错了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 2022-07-04
  • 2021-01-16
相关资源
最近更新 更多