我有一个类似下面的数据表
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
能够在一个步骤中获得所需的输出将是最好的,但这种组织数据的第二种方式可能是一个良好的开端。 关于如何处理这个问题的任何建议? 非常感谢你。 迭
答案 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,每个插槽每小时只有一个值。