我有一个问题,在r中使用'apply'函数执行逐行操作。我想计算两点之间的距离:
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...
I have try:
apply(X = start, MARGIN = 1, FUN = d, y = stop)
带来了一些奇怪的结果。你能帮我找到合适的解决方案吗?我知道如何使用dplyr rowwise()函数执行操作,但我的愿望是只使用base。你能解释一下为什么我用apply()会得到这样一个奇怪的结果吗?
循环遍历行序列并应用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