【问题标题】:Problem with row-wise operation in base R基础 R 中的逐行操作问题
【发布时间】:2021-12-08 14:51:34
【问题描述】:

我在使用 R 中的“应用”函数执行逐行操作时遇到问题。我想计算两点之间的距离:

d <- function(x,y){
length <- norm(x-y,type="2")
as.numeric(length)
}

坐标由两个数据框给出:

start <- data.frame(
a = c(7, 5, 17, 1), 
b = c(5, 17, 1, 2))

stop <- data.frame( 
b = c(5, 17, 1, 2),
c = c(17, 1, 2, 1))

我的意思是计算开始和停止坐标给出的连续距离。我希望它像这样工作:

d(start[1,], stop[1,])
d(start[2,], stop[2,])
d(start[3,], stop[3,])
etc...

我试过了:

apply(X = start, MARGIN = 1, FUN = d, y = stop)

这带来了一些奇怪的结果。你能帮我找到合适的解决方案吗?我知道如何使用 dplyr rowwise() 函数执行操作,但我希望只使用 base。 你能解释一下为什么我用 apply() 会收到这么奇怪的结果吗?

【问题讨论】:

    标签: r parallel-processing base rowwise


    【解决方案1】:

    遍历行序列并应用d

    sapply(seq_len(nrow(start)), function(i) d(start[i,], stop[i,]))
    [1] 12.165525 20.000000 16.031220  1.414214
    

    或者如果我们想使用apply,通过cbind创建单个数据,然后通过索引创建子集

    apply(cbind(start, stop), 1, FUN = function(x) d(x[1:2], x[3:4]))
    [1] 12.165525 20.000000 16.031220  1.414214
    

    或者可以使用dapply来提高效率

    library(collapse)
    dapply(cbind(start, stop), MARGIN = 1, parallel = TRUE,
       FUN = function(x) d(x[1:2], x[3:4]))
    [1] 12.165525 20.000000 16.031220  1.414214
    

    【讨论】:

    • 谢谢!哪种解决方案会更快?计划是将其用于约 300-10000 行数据帧。第一个解决方案不是和对行的简单循环一样快吗?
    • @Rafau rowwise 通常很慢。如果您想要更快的,请使用 dapply from collapse(更新)
    • @Rafau 和dapply 你也可以使用parallel = TRUE
    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2011-05-29
    • 2013-06-23
    相关资源
    最近更新 更多