r-在选定的行数上应用dplyr来计算角速度

  • 本文关键字:dplyr 应用 计算 角速度 r dplyr
  • 更新时间 :
  • 英文 :


我的数据集的一个示例结构如下:

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")) 

最新更新