【问题标题】:R apply function with dynamic criteriaR应用具有动态标准的函数
【发布时间】:2017-11-05 16:05:47
【问题描述】:

在尝试使用“应用”到矩阵而不是循环来提​​高效率时,我有一个问题。但问题是每个单独的输出都将基于其他单元格的结果。如果我在 excel 表中解释。对于单元格 D6,如果黄色单元格的总和

尝试了一些 R 代码: dat <- as.data.frame(matrix(, nrow = 6, ncol = 5))
dat[,1]=c(2,3,4,3,4,5) apply(dat[,2:5], 1:2, function(x){ifelse([...],1,0) })

不知道如何在括号部分编码.. 最终,想要用所有输出替换 dat 中的值。真的很感谢!!

【问题讨论】:

    标签: r apply


    【解决方案1】:

    如果想法是在您更新一个单元格之后,随后的计算会使用新更新的单元格,那么您确实需要一个双循环,而不是apply

    请注意,以下答案的最后一行与问题中显示的答案不同。我假设这代表问题中显示的答案中的错误。如果不是,请澄清规则。

    dat <- matrix(0, nrow = 6, ncol = 5)
    dat[,1] <- c(2,3,4,3,4,5)
    
    for(j in 2:ncol(dat)) 
       for(i in 1:nrow(dat))
          dat[i,j] <- ( sum(dat[1:i, j]) - dat[i, j] < 5 ) * 
                      ( sum(dat[i, 2:j]) - dat[i, j] < dat[i, 1] )
    dat
    

    给予:

         [,1] [,2] [,3] [,4] [,5]
    [1,]    2    1    1    0    0
    [2,]    3    1    1    1    0
    [3,]    4    1    1    1    1
    [4,]    3    1    1    1    0
    [5,]    4    1    1    1    1
    [6,]    5    0    0    1    1
    

    【讨论】:

    • 感谢您的及时回复!!是的,你是对的。那是错字。实际上,我以前使用过双循环。但问题是,实际上有数千行,需要分配的数量非常大,比如 100。这给了我几个小时的运行时间......有没有办法优化这个过程?就像我在 Excel 中考虑的那样,您可以在整个行/列中拖动和应用公式。谢谢!
    • 通常,如果您想加快迭代计算,可以使用 Rcpp 接口在 C++ 中重写它们。
    • 另外,你可以做的一个简单的事情(我已经修改了答案中的代码来做到这一点)是使用矩阵而不是数据帧——访问它们更快。
    猜你喜欢
    • 2015-07-29
    • 2022-01-10
    • 2020-08-12
    • 1970-01-01
    • 2016-06-11
    • 2016-04-27
    • 2020-03-09
    • 1970-01-01
    • 2020-11-20
    相关资源
    最近更新 更多