R: Подмножество подмножеств фрейма данных на основе NROW другого фактора в том же фрейме данных. - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть показания скорости ветра в трех направлениях (u, v и w) в двух местах (эталон mast6 и sonic_f) для определенного ветра углов (например, 0º, 5º и т. Д.), Которые я импортировал и пометил всеэто в один 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. РЕДАКТИРОВАТЬ

Желаемым выводом будут отдельные файлы для каждого угла,с длиной sonic_f_u v или w для Angle == 00 равной длине кратчайшего набора данных из mast_u v или w для того же угла.Например, для угла 00 все mast6_u v и w должны начинаться с 18602, как и sonic_f_u v и w.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Не думаю, что я полностью понимаю ваш вариант использования, но вот как я его интерпретировал: для каждого угла вы хотите найти максимальное время запуска и отфильтровать кадр данных по всем направлениям ветра на мачте и звуке, чтобыиметь одинаковое время начала.

В режиме тидиверса вы можете сделать это, найдя максимальное время начала для каждого угла и добавив его в исходный фрейм данных.Затем используйте фильтр, чтобы удалить несовпадающие времена запуска:

left_join(df,
          df %>%
            group_by(Angle) %>%
            summarise(max(StartTime)),
          by = "Angle"
) %>%
  filter(StartTime == `max(StartTime)`) %>%
  select(-`max(StartTime)`) %>%
  arrange(Angle, Location) %>%
  unique()

# # A tibble: 2 x 4
#   Location Angle StartTime
#   <chr>    <int>     <int>
# 1 mast6_w      0     18602
# 2 mast6_w      5     13002

Используйте arrange() со столбцами для сортировки, чтобы удалить дублирующиеся строки, и unique(), чтобы избавиться от дубликатов (может потребоваться что-то более надежноеесли столбцы строк не идентичны.

0 голосов
/ 01 октября 2018

Трудно побить data.table на этом ...

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

тесты

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
0 голосов
/ 27 сентября 2018

Предположим, у меня есть:

> dat
     Num  Location Angle StartTime
1    1   mast6_u     0     17602
2    2   mast6_v     0     17602
3    3   mast6_w     0     18602
4    4 sonic_f_u     0         2
5    5 sonic_f_v     0         2
6    6 sonic_f_w     0         2
7    7   mast6_u     5     13001
8    8   mast6_v     5     13001
9    9   mast6_w     5     13002
10  10 sonic_f_u     5         2
11  11 sonic_f_v     5         2
12  12 sonic_f_w     5         2

Для преобразования всех углов 0 в значение 0 для mast6_w вы можете сделать:

for (angle in c(0,5))
{
   dat[which(dat$Angle==0),4] <- dat[which(dat$Location=="mast6_w" & dat$Angle==0),4]
}

Это устанавливаетзначение 4-го столбца для всех углов 0 к значению в 0 и mast6_w.Затем вы получите:

> dat
   Num  Location Angle StartTime
1    1   mast6_u     0     18602
2    2   mast6_v     0     18602
3    3   mast6_w     0     18602
4    4 sonic_f_u     0     18602
5    5 sonic_f_v     0     18602
6    6 sonic_f_w     0     18602
7    7   mast6_u     5     13001
8    8   mast6_v     5     13001
9    9   mast6_w     5     13002
10  10 sonic_f_u     5         2
11  11 sonic_f_v     5         2
12  12 sonic_f_w     5         2

Для других структура здесь:

structure(list(Num = 1:12, Location = c("mast6_u", "mast6_v", 
"mast6_w", "sonic_f_u", "sonic_f_v", "sonic_f_w", "mast6_u", 
"mast6_v", "mast6_w", "sonic_f_u", "sonic_f_v", "sonic_f_w"), 
    Angle = c(0L, 0L, 0L, 0L, 0L, 0L, 5L, 5L, 5L, 5L, 5L, 5L), 
    StartTime = c(17602L, 17602L, 18602L, 2L, 2L, 2L, 13001L, 
    13001L, 13002L, 2L, 2L, 2L)), class = "data.frame", row.names = c(NA, 
-12L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...