dplyr изменяет применение пользовательской функции

#r #dplyr #tidyverse

#r #dplyr #tidyverse

Вопрос:

В моих данных у меня есть три группы, 4 временных момента (i) и зависимая переменная (RTfiltered).

 df1 <- data.frame(group = c(1,2,3,1,2,3,1,2,3,1,2,3),
                  i = c(1,1,1,2,2,2,3,3,3,4,4,4),
                  RTfiltered = c(100,105,94,33,97,87,65,20,19,4,11,56))
  

Для каждой группы я хочу подогнать модель линейной регрессии RTfiltered ~ i, и если эффект наклона значительно отличается от нуля, верните RTfiltered-slope * i . В противном случае верните RTfiltered. Вот функция, которая делает это:

 correctOrderEffects <- function(df) {
  fit <- lm(RTfiltered ~ i, data=df)
  if (summary(fit)$coefficients[2,4]>0.05) {
    return(df$RTfiltered)
  } else {
    slope = fit$coefficients[2];
    return(df$RTfiltered-slope*(df$i-2.5))
  }
}
  

Я хочу создать новый столбец в моем df, который будет содержать выходные данные correctOrderEffects для каждой группы. Каков наилучший способ добиться этого? Спасибо!

Ответ №1:

Вы можете сделать group_by() для ‘group’, а затем применить свою функцию к подгруппам с помощью do() . Это копирует ‘RTfiltered’, который вы указали в примере, это то, что вы ищете?

 df1 %>% 
  group_by(group) %>% 
  do(mutate(., effects = correctOrderEffects(.)))