2015-12-14 4 views
0

У меня есть data.frame, который содержит последовательные образцы и (X, Y) координаты разных людей в разных местах.Ошибка при построении кода dplyr

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) 

Это устраивает мой выход именно так, как я после, но только содержит столбец Distance полный NA, как показано ниже. Я ожидаю, что первая строка (Name и Location) будет содержать 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 линию, я в конечном итоге с другим форматом Name/Sample/Location, чем выше. Где я ошибаюсь в моем коде выше?

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

Вы не должны group_by "Образец" перед lag, только «Имя» и «Город». Затем используйте «Образец» в качестве order_by для lag. Причина, по которой я использую dplyr::lag, заключается в том, что лага уже используется zoo в моей системе.

Есть что-то очень странное с результатами. Я должен получить не-NA «Расстояние» на 3-й строке, но я получаю NA. Может быть ошибкой ....

require(dplyr) 
DistanceOutput <- df %>% 
arrange(Name,Sample,Location) %>% 
group_by(Name,Location) %>% 
mutate(lagX = dplyr::lag(X, order_by=Sample), lagY = dplyr::lag(Y, order_by=Sample)) %>% 
rowwise() %>% 
mutate(Distance = dist(matrix(c(X,Y,lagX,lagY),nrow=2,byrow=TRUE))) %>% 
select(-lagX, -lagY) 
DistanceOutput 
Source: local data frame [9 x 6] 
Groups: <by row> 

     Name Sample Location  X  Y Distance 
    (chr) (dbl) (chr) (dbl) (dbl) (dbl) 
1 Client A  1  City 4.35 -15.43  NA 
2 Client A  2  City -5.70 -19.67 10.908 
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 10.913 
6 Client B  3 Country 3.59 -18.95 9.318 
7 Client C  1 Suburban 4.42 -16.31  NA 
8 Client C  2 Suburban -5.75 -15.18 10.233 
9 Client C  3 Suburban 3.57 -18.97 10.061 
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 
Смежные вопросы