Как перебрать набор функций без вложенности для l oop в R? - PullRequest
0 голосов
/ 20 марта 2020

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

> str(example)
> str(Det17)
'data.frame':   43423 obs. of  3 variables:
 $ DateTime   : POSIXct, format: "2017-07-31 02:57:42" "2017-07-31 13:10:27" "2017-08-09 09:52:12" "2017-07-31 02:59:30" ...
 $ Transmitter: Factor w/ 58 levels "1657","1658",..: 38 38 46 38 38 38 38 29 38 38 ...
 $ Station    : Factor w/ 41 levels "A0","A1","A2",..: 35 35 35 35 35 35 35 35 35 35 ...
> 

Вот код, который я пытаюсь использовать:

for( i in Det17$Station){
  for( j in Det17$Transmitter){



Example <- Det17%>%
  filter(Station == i & Transmitter == j)%>%
  arrange(DateTime)%>%
  mutate(difftime = difftime(lead(DateTime),DateTime, tz = 'EST', units = 'secs'))%>%
  filter(difftime < 30)
      if(length(Example$difftime) > 0) {
        print("TRUE")
        } else {
      next
    }

  }
}

По сути, я хочу фильтровать свои данные по каждой комбинации станции и передатчика уровни. Я хочу упорядочить кадр данных по дате и времени, добавить новый столбец, который является разницей между двумя последовательными временами, снова отфильтровать по разностям менее 30 секунд, а затем вывести «TRUE», если длина новой переменной больше 0. В идеале я будет знать, какие комбинации привели к выводу «ИСТИНА», но я еще не получил там.

РЕДАКТИРОВАТЬ:

Вот группа функций, как функция, а не oop:

function(x){
  arrange(DateTime)%>%
  mutate(difftime = difftime(lead(DateTime),DateTime, tz = 'EST', units = 'secs'))%>%
  filter(difftime < 30)
      if(length(Example$difftime) > 0) {
        print("TRUE")
        } else {
      next
    }
}

1 Ответ

1 голос
/ 20 марта 2020

Функция разделения здесь полезна. Вы можете разделить ваш фрейм данных по измерениям, которые вы хотите перебрать.

DetSplit <- split(Det17, list(Det17$Station, Det17$Transmitter))

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

DetProcessed <- lapply(DetSplit, my_function_name)

затем свяжите все это вместе

DetProcessed <- data.table::rbindlist(DetProcess)

Вы также можете сделать это с трубами вместо того, чтобы разбивать их на отдельные объекты .

...