r- Использование суммы и совпадения, чтобы найти первое вхождение высокой частоты - PullRequest
1 голос
/ 29 января 2020

У меня есть несколько фреймов данных в широком формате, импортированных из DBF. Таким образом, каждый столбец - это дата, а каждая строка - наблюдение. Таким образом, на каждый день у меня от 500 до 2000 наблюдений в зависимости от размера географии c формы, на которую я смотрю. Для целей воспроизведения я создал 2 фиктивных фрейма данных с диапазоном значений, которые я могу видеть в моих реальных фреймах данных.

Data1<- data.frame(replicate(10, sample(0:1000, 20, rep= TRUE)))

Data<- data.frame(replicate(10, sample(0:1000, 20, rep= TRUE)))

Поскольку у меня есть много таких фреймов данных, я поместил их в список, чтобы я мог запускать функции сразу для многих.

filenames<- mget(ls(pattern= 'Data'))

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

library(plyr)
Datacount<- ldply(Data, function(x) length(which(x>=0 & x<=100))) 

Тогда мне нужно будет иметь возможность сопоставить первый экземпляр столбца (дату), в котором это подсчитанное число превышает 10% от общего числа наблюдений на столбец , Поэтому для кадра данных с 20 наблюдениями мне бы хотелось, чтобы первая дата, когда число ячеек в диапазоне от 0 до 100 превышало 2. Я ранее выполнил это с помощью apply (где «V1» - это имя столбца, содержащее число)

Datamatch<- apply (Datacount["V1"]>2,2,function(x) match (TRUE,x))

У меня вопрос, есть ли способ объединить эти функции в один процесс, который я могу использовать либо для for l oop над "именами файлов", либо с помощью одной из функций семейства lapply?

Для подробностей здесь приведен пример одной функции, которую я построил для запуска по каждой строке кадра данных. Это дает мне индекс столбца последней даты, где значение каждой строки <= 100. Затем я использовал lpply для l oop по всем фреймам данных в моем списке и добавляю результаты функции в исходный фрейм данных. </p>

icein <- function (dataframe) {dataframe $ icein <- apply (dataframe, 1, function (x) {tail (which (x <= 100), 1)}) dataframe} <br>list2env (lapply (имена файлов, icein), envir = .GlobalEnv)

1 Ответ

1 голос
/ 29 января 2020

После загрузки всех «данных» в list, l oop поверх list с помощью map, получите mean логического вектора (between(., 0, 100)), чтобы проверить, больше или равно 2, unlist data.frame, оберните which, чтобы получить индекс позиции, извлеките first one

library(dplyr)
library(purrr)
n <- 0.2
mget(ls(pattern= 'Data')) %>%
      map_int(~ .x %>% 
                  summarise_all(~ mean(between(., 0, 100)) >= n) %>% 
                  unlist %>%
                  which %>%
                  first)
...