【问题标题】:Apply a function to each element of a list and each row of two data frames将函数应用于列表的每个元素和两个数据框的每一行
【发布时间】:2017-03-24 18:39:33
【问题描述】:

是否有一个“应用”应用程序而不是在基础 R 中的两个数据帧的每一行之间进行双循环(不使用包)?

listD <- matrix(1:6, ncol=2)
listD <- split(listD,seq(NROW(listD)))
df1 <- data.frame(x=c(1,2), y=c(3,4))
df2 <- data.frame(x=c(3,2), y=c(1,1))
testFunc <- function(a, b, c) a * (b + c)

for (j in 1:nrow(df1)) {
  for (s in 1:nrow(df2)) {
     print(lapply(listD, FUN= testFunc, b=df1[j,], c=df2[s,]))
  }
}

谢谢!

【问题讨论】:

    标签: r loops apply


    【解决方案1】:

    使用outer 的副作用:

    invisible(outer(as.matrix(df1), as.matrix(df2), FUN = Vectorize(function (b, c) {
      print(lapply(listD, testFunc, b, c))
      NULL
    })))
    

    我不知道这是否是对你的 for 循环的改进。有一种说法是,必须不惜一切代价避免 R 中的 for 循环(也许它们看起来太容易了?)

    【讨论】:

    • 谢谢dash2!我不知道外部!你能解释一下为什么我需要“invisible”和“NULL”(如果我不使用NULL,我会得到一个错误)......还有......我该如何保存这个?谢谢!!
    • 您需要它,因为否则它会尝试将结果打印为矩阵,但事实并非如此。使用outer 很难保存结果,因为您不能将结果作为矩阵返回。您可能想从里到外:将lapply 放在outer 调用之外并返回一个矩阵列表。
    • 好的,如果循环和应用之间没有区别,那么我会坚持循环,因为它更清晰(至少现在对我来说......)
    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2014-09-24
    • 2020-12-31
    • 1970-01-01
    • 2020-12-10
    • 2013-03-21
    • 1970-01-01
    相关资源
    最近更新 更多