2016-08-05 80 views
1

我有一個關於R中的data.table的問題。 我正在研究加速度數據,這需要我從原始數據中生成特徵。我想每2秒分組數據。通過生成1個更多的列可以很容易地指出每2秒鐘的組和by組。 但是,我想做重疊的窗口。例如,我的原始數據是這如何在具有重疊值的data.table中進行分組?

a=data.table(x = c(1:10), y= c(2:11), z = c(5), second=rep(c(1:5),each=2)) 

XYZ第二

1:1 2 5 1

2:2 3 5 1

3:3 4 5 2

4:4 5 5 2

5:5 6 5 3

6:6 7 5 3

7:7 8 5 4

8:8 9 5 4

9:9 10 5 5

10:10 11 5 5

現在,我想每2秒計算x,y,z列的平均值。 1and2,2,3,3,4,4和5. 我可以運行for循環,但由於我有一個巨大的數據集,這將需要很長時間。你知道怎麼只用數據表工具嗎? 非常感謝

+0

請顯示您所需的輸出。 – Frank

回答

1

由於只有2「第二」的獨特觀察,我們得到的「X」,「Y」,「Z」列lead,通過數據的「第二」 unlist子集分組.table並獲得mean

nm1 <- c("x", "y", "z") 
na.omit(a[, paste0(nm1, 2) := lapply(.SD, function(x) shift(x, 2, 
    type = "lead")), .SDcols = nm1])[, .(Mean = mean(unlist(.SD))), 
      .(second = paste0(second, "-", second + 1))] 
# second  Mean 
#1: 1-2 3.666667 
#2: 2-3 5.000000 
#3: 3-4 6.333333 
#4: 4-5 7.666667 

或者稍微更緊湊的辦法是

library(dplyr) 
cbind(a[second!= last(second)], a[second!= first(second)])[ 
    ,.(Mean = mean(unlist(.SD))), .(second = paste0(second, "-", second+1))] 
# second  Mean 
#1: 1-2 3.666667 
#2: 2-3 5.000000 
#3: 3-4 6.333333 
#4: 4-5 7.666667 

或者另一種辦法是將它們放置在一個listrbind數據集,創建一個新的 'ID1' 列,在unlist之後得到mean.SDcols或者我們可以得到各列的個體mean

dt1 <- rbindlist(list(a[second!= last(second)], 
    a[second!= first(second)]), idcol=TRUE)[, id1:= as.numeric(gl(.N, 2, .N)), .id][] 

獲取mean由每列 '第二'

dt1[, lapply(.SD, mean), .(second = paste0(id1, "-", id1 + 1)), .SDcols = x:z] 

得到整個mean通過 '第二'

dt1[, mean(unlist(.SD)), .(second = paste0(id1, "-", id1 +1)), .SDcols = x:z] 
+0

對不起,這裏nm1是什麼對象? –

+0

@ThanhQuang它是'x','y','z'。更新 – akrun

+1

非常感謝!它的工作原理 –

3

這裏的另一種方式:

ag = data.table(
    second = c(1:2, 2:3, 3:4, 4:5), 
    g = rep(paste(1:4, 2:5, sep="-"), each=2) 
) 

a[ag, on="second"][, mean(unlist(.SD)), by=g, .SDcols=x:z] 

#  g  V1 
# 1: 1-2 3.666667 
# 2: 2-3 5.000000 
# 3: 3-4 6.333333 
# 4: 4-5 7.666667 

我相信你可以合作te ag較少手動,但我不清楚它背後的規則是什麼。

通常,如果您計算跨列的統計數據,那麼您的數據格式不正確。如果你有時間,我建議閱讀making data "tidy"

相關問題