我的data.frame Analysis
的结构如下,其中X
和Y
指的是ID
在Time
期间的坐标{ {1}}
X <- c(10.32,10.97,11.27)
Y <- c(32.57,33.54,33.98)
Time <- c(1,2,1)
ID <- c("Rod", "Rod", "Greg")
我希望知道每个ID
覆盖Time
或行的距离。我的data.frame是321300 obs。 3个变量,所以我在Analysis
的所有行之后进行迭代。我使用以下来计算距离:
out <- sapply(1:(nrow(Analysis)-1), function(i) {
d <- dist(Analysis[i:(i+1),1:2])
})
然后,我希望使用以下代码将out
添加到Analysis
:
Analysis$Distance <- out
我希望将Analysis$Distance
的第一行留空(因为有NA距离),但我不确定如何1.完成和2.添加到我的原始代码中?
答案 0 :(得分:0)
就像连接c(NA, out)
Analysis$Distance <- c(NA, out)
因为您的数据帧有R = 321300行,因此out
将有(R-1)行。
这通常是我们对diff()
等返回(R-1)行的函数所做的事情。
(比创建新列更快,因为所有NA:Analysis$Distance <- NA
然后单独计算每一行的距离)
答案 1 :(得分:0)
如果我正确地理解了这个问题,我们想要计算每个时间段(而不是跨主题ID)的每个主题id所经过的距离,因此,问题不仅仅是在前面插入NA而是还有关于修复代码以正确计算距离。
library(dplyr)
Analysis <- data.frame(
X = c(10.32,10.97,11.27),
Y = c(32.57,33.54,33.98),
Time = c(1,2,1),
ID = c("Rod", "Rod", "Greg"))
Analysis %>%
arrange(ID,Time) %>%
group_by(ID) %>%
mutate( lagX = lag(X), lagY = lag(Y)) %>%
rowwise() %>%
mutate(Distance =
dist( matrix( c(X,Y,lagX,lagY),nrow=2,byrow=TRUE) )
) %>%
select(-lagX, -lagY)
这会产生以下结果:
X Y Time ID Distance
1 11.27 33.98 1 Greg NA
2 10.32 32.57 1 Rod NA
3 10.97 33.54 2 Rod 1.167647
换句话说,格雷格根本没有去过。 Rod从1时刻到2时已经移动了1.167647。
(如果我误解了这个问题,我道歉 - 我在这里很新!)