我有一个data.frame,包含顺序样本和不同位置的不同人的(X,Y)坐标。
df <- data.frame(Name = rep(c("Client A","Client B", "Client C"),3),
Sample = rep(c(1,2,3), each=3),
Location = rep(c("City","Country","Suburban"),3),
X = c(4.35, 4.36, 4.42, -5.70, -5.70, -5.75, 3.60, 3.59, 3.57),
Y = c(-15.43, -15.44, -16.31, -19.67, -19.67, -15.18, -20.49, -18.95, -18.97))
我希望计算每个位置从一个样本到下一个样本的覆盖距离。这应该由每个名称,样本和位置安排。我使用dplyr
构建了以下代码。
require(dplyr)
DistanceOutput <- df %>%
arrange(Name,Sample,Location) %>%
group_by(Name,Sample,Location) %>%
mutate( lagX = lag(X), lagY = lag(Y)) %>%
rowwise() %>%
mutate(Distance =
dist( matrix( c(X,Y,lagX,lagY),nrow=2,byrow=TRUE) )
) %>%
select(-lagX, -lagY)
这会像我之前的那样精确地排列我的输出,但只包含一个充满NA
的距离列,如下所示。我希望第一行(名称和位置)包含距离NA,但不包含接下来的两个样本。
> ddply(DistanceOutput,.(Name, Sample),function(x) head(x,2))
Name Sample Location X Y Distance
1 Client A 1 City 4.35 -15.43 NA
2 Client A 2 City -5.70 -19.67 NA
3 Client A 3 City 3.60 -20.49 NA
4 Client B 1 Country 4.36 -15.44 NA
5 Client B 2 Country -5.70 -19.67 NA
6 Client B 3 Country 3.59 -18.95 NA
7 Client C 1 Suburban 4.42 -16.31 NA
8 Client C 2 Suburban -5.75 -15.18 NA
9 Client C 3 Suburban 3.57 -18.97 NA
如果我重新排列group_by
行,我最终会使用与上面不同的名称/样本/位置格式。我上面的代码在哪里出错?
R version 3.2.2 (2015-08-14)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.10.5 (Yosemite)
答案 0 :(得分:0)
不确定我是否理解您的问题,这是我的尝试:
ddply(df, .(Name), function(d) {
d <- d[order(d$Location), ]
distance <- sqrt((diff(d$X))^2 + (diff(d$Y))^2)
d$cum_distance <- cumsum(c(0, distance))
return(d)
})
以下是输出:
Name Sample Location X Y cum_distance
1 Client A 1 City 4.35 -15.43 0.00000
2 Client A 2 City -5.70 -19.67 10.90780
3 Client A 3 City 3.60 -20.49 20.24388
4 Client B 1 Country 4.36 -15.44 0.00000
5 Client B 2 Country -5.70 -19.67 10.91313
6 Client B 3 Country 3.59 -18.95 20.23099
7 Client C 1 Suburban 4.42 -16.31 0.00000
8 Client C 2 Suburban -5.75 -15.18 10.23259
9 Client C 3 Suburban 3.57 -18.97 20.29372
答案 1 :(得分:0)
你不应该group_by
“示例”在lag
之前,只能在“名称”和“城市”之前。然后,使用“Sample”作为order_by
的{{1}}。我使用lag
的原因是我的系统中dplyr::lag
已经使用了滞后。
但结果却有些奇怪。我应该在第3行获得非NA“距离”,但我得到了NA。可能是个错误......
zoo