#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(.)))