构造dplyr代码时出错

时间:2015-12-14 02:54:02

标签: r dplyr

我有一个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)

2 个答案:

答案 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