2015-11-24 21 views
1

我的數據是結構如下:如何使用dplyr計算R中的點積?

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

我希望計算角位移,從連續的運動矢量的點積,以及角速度或角位移的變化率。我已經使用了下面的代碼,但是這不會根據MovementAnalysis$Name中的更改重新開始分析?簡單地說,我想爲每個人計算MovementAnalysis$Sample的角速度。

i <- 1 
sampleRate <- 2 
k <- as.integer(sampleRate) 
a_velocity <- matrix(NA, length(MovementAnalysis$X)) 

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]) 
     a_velocity[i] <- acos(sum(a * b)/(sqrt(sum(a * a)) * sqrt(sum(b * b)))) * (180/pi) 
    } 

    i <- i+1 
} 

我想用dplyr完成以上,但我不能確定的代碼?我曾嘗試以下:

function(x) { 
    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 
    } 
    } 

    MovementAnalysis <- MovementAnalysis %>% 
    arrange(Name) %>% 
    group_by(Name) %>% 
    mutate(AngularV = function(x)) 


這對問題返回Error: unexpected ')' in: " group_by(Name) %>% mutate(AngularV = function(x))"任何想法的錯誤?前兩行角速度爲Name的前兩行應爲NA

SessionInfo() 
    R version 3.1.2 (2014-10-31) 
    Platform: i386-w64-mingw32/i386 (32-bit) 

    locale: 
    [1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252   
    LC_MONETARY=English_Australia.1252 
    [4] LC_NUMERIC=C      LC_TIME=English_Australia.1252  

    attached base packages: 
    [1] stats  graphics grDevices utils  datasets methods base  

    other attached packages: 
    [1] dplyr_0.3.0.2 plyr_1.8.1 ggplot2_1.0.0 

    loaded via a namespace (and not attached): 
    [1] assertthat_0.1 colorspace_1.2-4 DBI_0.3.1  digest_0.6.4  
    grid_3.1.2  gtable_0.1.2  
    [7] labeling_0.3  lazyeval_0.1.9 magrittr_1.0.1 MASS_7.3-35  
    munsell_0.4.2 parallel_3.1.2 
    [13] proto_0.3-10  Rcpp_0.11.1  reshape2_1.4  scales_0.2.4  
    stringr_0.6.2 tools_3.1.2`  
+0

你的縮進使事情變得難走,我固定它。每個縮進級別2個空格對於SO最適合。 – smci

回答

1
  • 首先,不使用逐元素相乘,然後求和:sum(a*b)。使用矩陣乘法運算符:a %*% b。因此,這將是:(a %*% b)/(sqrt(a %*% a) * sqrt(b %*% b))

  • 但你真的想獲得餘弦距離,這是一個重複:Find cosine similarity between two arrays