我的数据集的一个示例结构如下:
dput(head(MovementAnalysis,10))
structure(list(Name = c("Amber", "Amber", "Amber", "Amber", "Amber",
"Jeff", "Jeff", "Jeff", "Jeff", "Jeff"), Sample = c(1, 2, 3, 4, 5, 1, 2,
3, 4, 5), X = c(26.66, 26.66, 26.65, 26.64, 26.64, 26.47, 26.46, 26.45,
26.43, 26.42), Y = c(-12.38, -12.37, -12.36, -12.36, -12.35, -12.23,
-12.22, -12.22, -12.22, -12.22), .Names = c("Name", "Sample", "X", Y"), row.names = c(NA, 10L), class = "data.frame")
我希望使用以下数学公式计算每个Name
的角速度,其中k=2。
i <- 2
while(i < length(X) - k){
if (i > k)
{
a <- c(X[i] - X[i-k], Y[i] - Y[i-k])
b <- c(X[i+k] - X[i], Y[i+k] - Y[i])
AngularVelocity <- acos(sum(a * b) / (sqrt(sum(a * a)) * sqrt(sum(b * b)))) * (180 / pi)
}
i <- i+1
}
我试图在dplyr
中这样做(正如我在下面尝试的那样),因为我的实际数据集有100多万行,但我一直在思考如何保留前2行(k),然后从第3行开始迭代,以计算每个Name
的角速度?
Output <- MovementAnalysis %>%
arrange(Name,Sample) %>%
group_by(Name) %>%
mutate(An = (X - (lag(X)-2) + (Y - (lag(Y)-2))))
Output <- MovementAnalysis %>%
arrange(Name,Sample) %>%
group_by(Name) %>%
mutate(Bn = (X - (lag(X)+2) + (Y - (lag(Y)+2))))
我知道这是一个很长的问题,所以欢迎任何关于如何改进问题的反馈。
更新
我已经成功地在下面的答案中使用代码一段时间了。然而,我现在在使用新数据集尝试代码时遇到了一个错误。该数据集的示例如下:
# Create list of inviduals, drill number and practical or criterion measure
ID = c("Gus_D1_Practical", "Gus_D1_Criterion", "Hudson_D1_Practical", "Hudson_D1_Criterion")
# Set the seed
set.seed(300)
# Create a data.frame of dummy peak velocity data from two different tracking systems
ExampleDataset <- data.frame(ID = rep((ID), each = 300),
Sample = rep(1:300, each = 1),
X = runif(300, 4.5, 6.7),
Y = runif(300, 4.1, 8))
# Set the SampleRate
SampleRate <- 100
k <- as.integer(SampleRate)
# Calculate Angular Velocity
library(dplyr)
Output <- ExampleDataset %>%
arrange(ID,Sample) %>%
group_by(ID) %>%
do( { a = diff(cbind(.$X, .$Y),lag=2)
b = tail(a, -k)
a = head(a, -k)
ang_vel = acos(rowSums(a*b)/(sqrt(rowSums(a^2))*sqrt(rowSums(b^2)))) * (180 / pi)
data_frame(Sample=head(tail(.$Sample,-k),-k), ang_vel) }) %>%
right_join(ExampleDataset, by = c("ID","Sample"))
不幸的是,当我现在尝试计算角速度时,返回了以下错误:
Error in data_frame_(lazyeval::lazy_dots(...)) :
arguments imply differing number of rows: 100, 198
你认为我做错了什么吗?
我怀疑这与dplyr
的应用程序类型有点不同。你可以试试
library(dplyr)
Output <- MovementAnalysis %>%
arrange(Name,Sample) %>%
group_by(Name) %>%
do( { a = diff(cbind(.$X, .$Y),lag=2)
b = tail(a, -k)
a = head(a, -k)
ang_vel = acos(rowSums(a*b)/(sqrt(rowSums(a^2))*sqrt(rowSums(b^2)))) * (180 / pi)
data_frame(Sample=head(tail(.$Sample,-k),-k), ang_vel) }) %>%
right_join(MovementAnalysis, by = c("Name","Sample"))