2017-01-25 9 views
2

У меня есть куча факторных переменных, которые имеют одинаковые уровни, и я хочу, чтобы они все переупорядочивались аналогично, используя fct_relevel из пакета forcats. Многие имена переменных начинаются с одинаковых символов («Q11A» - «Q11X», «Q12A» - «Q12X», «Q13A» - «Q13X» и т. Д.). Я хотел использовать функцию starts_with от dplyr, чтобы сократить задачу. Следующая ошибка не привела мне ошибку, но она ничего не сделала. Есть ли что-то, что я делаю неправильно?Использование fct_relevel над списком переменных с помощью map_at

library(dplyr) 
library(purrr) 
library(forcats) 
library(tibble) 

#Setting up dataframe 
f1 <- factor(c("a", "b", "c", "d")) 
f2 <- factor(c("a", "b", "c", "d")) 
f3 <- factor(c("a", "b", "c", "d")) 
f4 <- factor(c("a", "b", "c", "d")) 
f5 <- factor(c("a", "b", "c", "d")) 
df <- tibble(f1, f2, f3, f4, f5) 

levels(df$f1) 
[1] "a" "b" "c" "d" 

#Attempting to move level "c" up before "a" and "b". 
df <- map_at(df, starts_with("f"), fct_relevel, "c") 

levels(df$f1) 
[1] "a" "b" "c" "d" #Didn't work 

#If I just re-level for one variable: 
fct_relevel(df$f1, "c") 
[1] a b c d 
Levels: c a b d 
#That worked. 

ответ

2

Я думаю, что вы ищете mutate_at:

df <- mutate_at(df, starts_with("f"), fct_relevel, ... = "c") 

df$f1 
[1] a b c d 
Levels: c a b d 
+0

Очевидно, я запутался, когда я должен использовать 'purrr :: map' и когда я должен используйте 'dplyr :: mutate'. – Phil

+0

Это легко простить. Обычно вы хотите использовать разные вариации 'mutate' для столбцов и' map' внутри 'mutate' для столбцов списка и невостребованных вычислений. – Axeman

+0

@akrun, извините, я только нахожу приличных дураков, которые заканчиваются использованием 'mutate_each', который планируется устареть. Не стесняйтесь забивать, если у вас есть хорошая цель 'mutate_at'. – Axeman