首页 > 解决方案 > R:基于同一数据帧中另一个因素的 NROW 对数据帧的子集进行子集化

问题描述

对于特定风角(例如 0º、5º 等),我在两个位置(参考 mast6 和 sonic_f)有 3 个方向(u、v 和 w)的风速读数,我已将所有这些导入并绑定到单个 data.frame 中。

我想以成对的形式绘制数据,但参考桅杆在前 X 秒内没有记录。我需要将声波文件修剪为等效参考桅杆数据为每个角度和每个 uv 或 w 方向显示的第一个时间戳。

例如,每个位置的开始时间如下:

> aggregate(data=df,StartTime~MeasurementLocation+Angle,min)
         Location Angle StartTime
1     mast6_u      00    17602
2     mast6_v      00    17602
3     mast6_w      00    18602
4   sonic_f_u      00        2
5   sonic_f_v      00        2
6   sonic_f_w      00        2
7     mast6_u      05    13001
8     mast6_v      05    13001
9     mast6_w      05    13002
10  sonic_f_u      05        2
11  sonic_f_v      05        2
12  sonic_f_w      05        2

因此,例如,属于角度 00 的所有数据的开始时间必须是 18602。 编辑

所需的输出将是每个角度的单独文件,对于 Angle==00,sonic_f_u v 或 w 的长度与同一角度的 mast_u v 或 w 的最短数据集的长度相同。例如对于角度 00,mast6_u v 和 w 必须都从 18602 开始,sonic_f_u v 和 w 也应该如此。

标签: rdplyr

解决方案


Hard to beat data.table on this...

library(data.table)
setDT(df)[ , start_time_max := max( StartTime ), by = Angle][StartTime >= start_time_max, ][, start_time_max := NULL][]

#    Num Location Angle StartTime
# 1:   3  mast6_w     0     18602
# 2:   9  mast6_w     5     13002

benchmarks

microbenchmark::microbenchmark(
  data.table = setDT(df)[ , start_time_max := max( StartTime ), by = Angle][StartTime >= start_time_max, ][, start_time_max := NULL][],
  tidyverse = { left_join(df,
                          df %>%
                            group_by(Angle) %>%
                            summarise(max(StartTime)),
                          by = "Angle"
  ) %>%
      filter(StartTime == `max(StartTime)`) %>%
      select(-`max(StartTime)`) %>%
      arrange(Angle, Location) %>%
      unique()

    }, times = 100
)

# Unit: microseconds
#       expr      min       lq     mean   median       uq       max neval
# data.table  937.233 1050.057 1195.317 1196.169 1289.260  1808.488   100
# tidyverse  4694.900 4991.645 5409.146 5172.855 5341.563 24359.309   100

推荐阅读