Сегодня я начал работать с функциями мурлыкания, поэтому я могу попробовать использовать R из более функционального подхода.В настоящее время у меня есть фрейм данных, который содержит переменную ответа с множеством других переменных.Моя цель - разделить фрейм данных по уровням в столбце ответа, а затем запустить shapiro.test () на всех фреймах разделения.
Например, этот код работает:
# fake data
df = data.frame(y = c(rep(1,10), rep(2, 10)),
a = rnorm(20),
b = runif(20),
c = rnorm(20))
df$y <- factor(df$y)
df %>%
select(y, a) %>%
split(.$y) %>%
map(~shapiro.test(.x$a))
И это возвращает:
$`1`
Shapiro-Wilk normality test
data: .x$a
W = 0.93455, p-value = 0.4941
$`2`
Shapiro-Wilk normality test
data: .x$a
W = 0.7861, p-value = 0.009822
Так что это работает так, как я хочу, для отдельного столбца, но яхотел бы, чтобы он работал на заданном векторе любых столбцов.Сейчас я думаю о том, чтобы создать вектор имен столбцов, которые я хочу запустить, и использовать его на карте ().Я думаю, что я довольно близок к тому, чтобы иметь это право, но я просто немного застрял.
# Function that splits the df into two groups based on y levels and run shapiro test on the split dfs
shapiro <- function(var) {
df_list = df %>%
select(y, var) %>%
split(.$y) %>%
map(~shapiro.test(.x$var))
return(df_list)
}
Это терпит неудачу:
> shapiro(a)
Error in .f(.x[[i]], ...) : object 'a' not found
Что имеет смысл, поскольку a не сохраняетсяв окружающей среде.Это своего рода направление, которое я себе представляю, но я не знаю, есть ли лучший способ сделать это.
# the column names I want the function to take
columns = c(a, b, c)
# map it
map(columns, shapiro)
Однако, это дает ошибку, так как имена столбцов не находятся вокружающая среда.У кого-нибудь есть предложения как это исправить или улучшить?
Спасибо!