R:展平数据表组并从中创建数据表

时间:2016-11-22 14:11:48

标签: r data.table grouping

我有一个类似下面的数据表

       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共享相同日期列和h的组,因此调用DT [,lapply(.SD,function(x)x),by = list(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

能够在一个步骤中获得所需的输出将是最好的,但这种组织数据的第二种方式可能是一个良好的开端。 关于如何处理这个问题的任何建议? 非常感谢你。 迭

1 个答案:

答案 0 :(得分: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,每个插槽每小时只有一个值。