2017-05-08 57 views
0

我有一個函數來計算時滯手段。按組應用多變量自定義函數

computeMSD <- function(x, y) 
{ 
    until = length(x) 

    msd.t <- rep(0,until) 
    for (dt in 1:until) 
    { 
     displacement.x <- as.vector(na.omit(x[(1+dt):length(x)]) - x[1:(length(x)-dt)]) 
     displacement.y <- as.vector(na.omit(y[(1+dt):length(y)]) - y[1:(length(y)-dt)]) 
     sqrdispl <- (displacement.x^2 + displacement.y^2) 
     msd.t[dt] <- mean(sqrdispl) 
    } 
    return(msd.t) 
} 

對於每x,y座標設置I可以得到滯後等於座標組的數目的長度的最大數量,但結果不計算行方向或產生單個值作爲更常見的情況下,例如mean()。如何使用這個功能?將df作爲參數並以這種方式解決這個問題會比較容易嗎,或者之後的小組應用呢?

Dput'ed數據樣本:

coordinates <- structure(list(t = c(0L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 0L, 1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L), x = c(77.1122594462641, 76.9268087636518, 
77.0824919447165, 77.2633028849826, 77.2986534556372, 76.9451627690267, 
77.016568428648, 77.2031866048323, 77.152257554526, 77.0782765887312, 
77.3698311386635, 77.190034642786, 77.4707481927975, 77.5514683890447, 
77.4221538951355, 77.4870731430072, 77.5337382441554, 77.6083147834499, 
78.0014060220692, 77.914303422688, 77.898082741035, 24.8338993587775, 
25.2639774845389, 25.3742480546192, 25.4623060340105, 25.3898139500925, 
25.1593906132865, 24.6920776131651, 25.1743141921877, 25.4778651641087 
), y = c(4.74130698923006, 4.46551233016053, 3.93123573693172, 
4.55995544813954, 4.67992700953899, 4.64997652545671, 4.55836080283123, 
4.64450813733432, 4.68934313336444, 4.81733283824963, 4.58214680116643, 
4.66256892407664, 4.25844572526743, 4.31419251260346, 4.22828043965437, 
4.38041204106514, 4.47565650005594, 4.1772558339639, 4.349937065643, 
4.32154195325593, 4.44461228490339, 18.7882053639457, 18.9248711275236, 
19.1533421986122, 18.5732434777371, 18.627847083506, 18.9591158655086, 
18.8256309202803, 18.8955701466044, 18.5083633311125), track_id = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", 
"47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", 
"58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", 
"69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", 
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", 
"91", "92", "93", "94", "95", "96", "97", "98", "99", "100", 
"101", "102", "103", "104", "105", "106", "107", "108", "109", 
"110", "111", "112", "113", "114", "115", "116", "117", "118", 
"119", "120", "121", "122", "123", "124", "125", "126", "127", 
"128", "129", "130", "131", "132", "133", "134", "135", "136", 
"137", "138", "139", "140", "141", "142", "143", "144", "145", 
"146", "147", "148", "149", "150", "151", "152", "153", "154", 
"155", "156", "157", "158", "159", "160", "161", "162", "163", 
"164", "165", "166", "167", "168", "169", "170", "171", "172", 
"173", "174", "175", "176", "177", "178", "179", "180", "181", 
"182", "183", "184", "185", "186", "187", "188", "189", "190", 
"191", "192", "193", "194", "195", "196", "197", "198", "199", 
"200", "201", "202", "203", "204", "205", "206", "207", "208", 
"209", "210", "211", "212", "213", "214", "215", "216", "217", 
"218", "219", "220", "221", "222", "223", "224", "225", "226", 
"227", "228", "229", "230", "231", "232", "233", "234", "235", 
"236", "237", "238", "239", "240", "241", "242", "243", "244", 
"245", "246", "247", "248", "249", "250", "251", "252", "253", 
"254", "255", "256", "257", "258", "259", "260", "261", "262", 
"263", "264", "265", "266", "267", "268", "269", "270", "271", 
"272", "273", "274", "275", "276", "277", "278", "279", "280", 
"281", "282", "283", "284", "285", "286", "287", "288", "289", 
"290", "291", "292", "293", "294", "295", "296", "297", "298", 
"299", "300", "301", "302", "303", "304", "305", "306", "307", 
"308", "309", "310", "311", "312", "313", "314", "315", "316", 
"317", "318", "319", "320", "321", "322", "323", "324", "325", 
"326", "327", "328", "329", "330", "331", "332", "333", "334", 
"335", "336", "337", "338", "339", "340", "341", "342", "343", 
"344", "345", "346", "347", "348", "349"), class = "factor")), .Names = c("t", 
"x", "y", "track_id"), class = c("data.table", "data.frame"), row.names = c(NA, 
-30L)) 

手動單track_id

library(dplyr) 
single_track <- filter(df, track_id == "1") 
single_track$msd <- computeMSD(single_track$x, single_track$y) 
single_track$lag <- seq_along(single_track$msd) 

工作給人

t  x  y track_id  msd lag 
1 0 77.11226 4.741307  1 0.0934063 1 
2 1 76.92681 4.465512  1 0.1426363 2 
3 2 77.08249 3.931236  1 0.1376502 3 
4 3 77.26330 4.559955  1 0.1457362 4 
5 4 77.29865 4.679927  1 0.1715850 5 
6 5 76.94516 4.649977  1 0.2146411 6 

回答

1

好像你可以在dplyr

使用 group_by
# Single ID code 
single_track <- filter(coordinates, track_id == "1") 
single_track$msd <- computeMSD(single_track$x, single_track$y) 
single_track$lag <- seq_along(single_track$msd) 

# Using group_by 
test <- coordinates %>% 
    group_by(track_id) %>% 
    mutate(msd = computeMSD(x, y), 
     lag = seq_along(msd)) %>% 
    filter(track_id == "1") 

all.equal(single_track$msd, test$msd) 
# [1] TRUE 
+0

哇,比我想象的要容易得多! –