2016-11-22 27 views
0

我有,看起來像下面R:平坦化數據表組和創建數據表了出來

 datecolumn hourcolumn daycolumn V h m dir_0 dir_15 dir_30 dir_45 
    1: 2014.01.02  08:00   4 83 8 0  1  NA  NA  NA 
    2: 2014.01.02  08:15   4 72 8 15 NA  -1  NA  NA 
    3: 2014.01.02  08:30   4 60 8 30 NA  NA  0  NA 
    4: 2014.01.02  08:45   4 107 8 45 NA  NA  NA  -1 
    5: 2014.01.02  09:00   4 443 9 0 -1  NA  NA  NA 
    ---                  
40831: 2016.11.17  20:45   4 490 20 45 NA  NA  NA  -1 
40832: 2016.11.17  21:00   4 461 21 0  1  NA  NA  NA 
40833: 2016.11.17  21:15   4 502 21 15 NA  1  NA  NA 
40834: 2016.11.17  21:30   4 441 21 30 NA  NA  1  NA 
40835: 2016.11.17  21:45   4 617 21 45 NA  NA  NA  1 

所述一個對於每一個日期,可以有更多小時的觀察的數據表,並且每個小時具有一個每15分鐘進入一次。

我需要做的是 「扁平化」 的DT實現這一結果

datecolumn h m dir_0 dir_15 dir_30 dir_45 
1: 2014.01.02 8 0  1  -1  0  -1 
2: 2014.01.02 9 0 -1  -1  1  -1 
3: 2014.03.09 9 0  1  1  -1  -1 
. 
. 
. 

我試過這個代碼

DT[, lapply(.SD, function(x) x), by=list(datecolumn, h), .SDcols = c("dir_0", "dir_15", "dir_30", "dir_45")] 

,但它給了我下面的:

datecolumn h m dir_0 dir_15 dir_30 dir_45 
1: 2014.01.02 8 0  1  NA  NA  NA 
2: 2014.01.02 8 15 NA  -1  NA  NA 
3: 2014.01.02 8 30 NA  NA  0  NA 
4: 2014.01.02 8 45 NA  NA  NA  -1 
5: 2014.01.02 9 0 -1  NA  NA  NA 
6: 2014.01.02 9 15 NA  -1  NA  NA 
7: 2014.01.02 9 30 NA  NA  1  NA 
8: 2014.01.02 9 45 NA  NA  NA  -1 
9: 2014.03.09 9 0  1  NA  NA  NA 
10: 2014.03.09 9 15 NA  1  NA  NA 
11: 2014.03.09 9 30 NA  NA  -1  NA 
12: 2014.03.09 9 45 NA  NA  NA  -1 
. 
. 
. 

我可以通過一個循環子集和提取它,但它遠非優雅和快速

在上面的輸出中,每行都是來自dir_X列的單個條目,而不是與所有dir_X共享同一個datecolumn和h以使得調用DT [,lapply(.SD,function(x)x),by =列表(datecolumn,H),.SDcols = C( 「dir_0」, 「dir_15」, 「dir_30」, 「dir_45」)] [1]將返回一個列表,我想:

[[1]] 
     datecolumn h m dir_0 dir_15 dir_30 dir_45 
[1,] 2014.01.02 8 0  1  NA  NA  NA 
[2,] 2014.01.02 8 15 NA  -1  NA  NA 
[3,] 2014.01.02 8 30 NA  NA  0  NA 
[4,] 2014.01.02 8 45 NA  NA  NA  -1 

如果能夠在一步中獲得所需的輸出將是最好的,但這種組織數據的第二種方式可能是一個好的開始。 有關如何處理此問題的任何建議? 非常感謝。 迭戈

+0

在代碼中,您只是在進行標識操作。 – akrun

回答

0

這裏是一個基於dplyr解決方案(至少我認爲這是你正在嘗試做的):

df %>% 
    group_by(datecolumn, h) %>% 
    summarise(dir_0 = mean(dir_0, na.rm = T), 
      dir_15 = mean(dir_15, na.rm = T), 
      dir_30 = mean(dir_30, na.rm = T), 
      dir_45 = mean(dir_45, na.rm = T) 
     ) 

假設你的數據幀被稱爲DF,且僅是每插槽每小時一個值。

+0

是的!這正是我需要的! 我從來沒有使用dplyr,我認爲運算符%>%的作用使得它值得做:=在data.table中做... 我想你使用平均函數只是爲了快速過濾只包含一個矢量一個有意義的價值,不是嗎? 非常感謝您的幫助。 – Lord