Как вернуть значение из переменной на основе условия в другой переменной в сгруппированном фрейме данных? - PullRequest
1 голос
/ 03 апреля 2019

Я вычисляю некоторые метрики для каждого набора переменных в сгруппированном кадре данных, используя базовый подход group_by() + summarize_at. Каждая группа представляет небольшую серию времени. Одна метрика, которую я хотел бы рассчитать, - это начальное значение (в данном случае day == 1) каждой переменной в каждой группе. Таким образом, обобщенная проблема состоит в том, чтобы возвращать значение переменной на основе критерия в другой переменной внутри групп сгруппированного кадра данных. В рамках подхода group_by() + summarize_at я считаю, что мне нужна пользовательская функция, которую summarize_at затем можно применить к каждой переменной. Я могу успешно развернуть другие пользовательские функции, которые зависят только от имеющейся переменной данных. Я, кажется, завис на том, чтобы заставить функцию посмотреть другие столбцы информационного кадра.

Я не женат на таком подходе, и приветствую альтернативные рекомендации. Тем не менее, я чувствую себя наиболее комфортно с dplyr.

# a dataset
df <- data.frame(day = rep(c(1:5),3),
                 group = c(rep(1,5),rep(2,5),rep(3,5)),
                 var_a = seq(1:15),
                 var_b = seq(2,30, length.out = 15),
                 var_c = seq(3,45, length.out = 15))

# the logic of what I am going for, on a manually extracted example group:
# initial value (day == 1) of var_a for group 2

df_subset <- df %>% 
  filter(group == 2)
df_subset$var_a[which(df_subset$day == 1)]
# [1] 6

# my laughable attempt at a function

initial <- function(x){
  ini <- which(.$day == 1)
  x[ini]
}

# custom function deployed in dplyr pipe (which of course doesn't work)
df %>% 
  group_by(group) %>% 
  summarize_at(c("var_a","var_b","var_c"), 
               list(max = max, ini = initial)) 

Большое спасибо.

1 Ответ

0 голосов
/ 03 апреля 2019

После шага group_by укажите переменные для выбора в summarise_at, используя одну из select_helpers (здесь starts_with работает нормально), а в list примените различные функции для каждой изстолбцы (~ - это один из способов префикса анонимного вызова вместо явного указания function(x)). Для второй функции «день» не является частью выбранных столбцов, но его можно выбрать с именем столбца без кавычек

library(dplyr)
df %>%
  group_by(group) %>%
  summarise_at(vars(starts_with('var')),
         list(max = ~max(.), ini = ~ .[day == 1]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...