如何有效地迭代网格中的data.frame对象的总和?

时间:2016-08-07 12:02:35

标签: r loops dataframe

我在列表中有数字data.frame对象,并希望将它们并行添加。但是,我观察到在网格中添加配对的data.frame对象是重复的,我只能迭代网格的上/下三角形并对它们求和。我为此做了简单的R函数,但我的输出位效率较低,因为重复的总和发生了。我敢打赌,必须有更直观/有效的方式来完成这项工作。当data.frame对象在网格中时,有没有人有更好的解决方案来更轻松/有效地做到这一点?有什么建议可以更好地制定我的功能吗?感谢

模拟数据

fo <- data.frame( start=seq(1, by=4, len=6), stop=seq(3, by=4, len=6))
ba <- 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))

mylist <- list(fo, ba, bleh)

我的自定义功能

add_pairDF <- function(set, idx=1L) {
  quer <- set[[idx]]
  .quer <- mapply('+', quer, quer)
  supp <- lapply(set[-idx], function(ele_) {
    ans <- mapply('+', quer, ele_)
  })
  res <- c(list(.quer), supp)
  return(res)
}

初始输出(存在重复):

ans_1 <- add_pairDF(set=mylist, idx=1L)
ans_2 <- add_pairDF(set=mylist, idx=2L)
ans_3 <- add_pairDF(set=mylist, idx=3L)

期望的输出:

在我的初始输出中,函数确实对配对的data.frame对象进行求和,但我认为我不需要使用不同的mylist索引三次命中我的函数。

我想删除配对data.frame上的重复和,如果所有配对的data.frame对象都放在网格方格中,则目标是在下/上三角(包括对角线)上行走。我怎样才能避免这种重复?什么是网格中data.frame对象的有效迭代?有人可以提出可能的想法来解决我的问题吗?

1 个答案:

答案 0 :(得分:0)

以下是一种方式。

add_df <- function(df1, df2) {
   mapply("+", df1, df2)
}

# Get all pairs of indices
ndf <- length(mylist)
idx <- expand.grid(1:ndf, 1:ndf)
idx <- idx[idx[,1] <= idx[,2],] 

Map(function(i, j) add_df(mylist[[i]], mylist[[j]]), idx[,1], idx[,2] )

我不确定添加具有不同行数的数据帧时的意图是什么。但是,假设您希望答案仅添加两个数据框共有的行,您可以将add_df替换为:

add_df <- function(df1, df2) {
   nr <- min(nrow(df1), nrow(df2))
   df1[1:nr,] + df2[1:nr,]
}

编辑:我将mapply替换为Map,以确保结果是后一种情况下的列表。