Платформа, с которой я импортирую данные в R, не поддерживает указание типа данных, поэтому все мои столбцы character
. У меня есть файл Excel, в котором указываются столбцы factor
, включая соответствующие labels
и levels
. Сейчас я пытаюсь написать функцию для динамического изменения типа данных в различных столбцах моего data.frame
Благодаря превосходному ответу на этот вопрос ( dplyr - mutate: использовать имена динамических переменных ) мне удалось написать следующую функцию, в которой я динамически устанавливаю имя столбца для функции mutate
,
readFactorData <- function(filepath) {
t <- read.xlsx(filepath)
sapply(nrow(t), function(i) {
colname <- as.character(t[i, "Item"])
factorLevels <- t[i, 3:ncol(t)][which(!is.na(t[i, 3:ncol(t)]))]
totalLevels <- length(factorLevels)
listOfLabels <- as.character(unlist(factorLevels))
mutate(d, !!colname := factor(d[[colname]], labels=(1:totalLevels), levels=listOfLabels))
# requires dplyr v.0.7+
# the syntax `!!variablename:=` forces evaluation of the variablename before evaluating the rest of the function
})
}
Это работает, и каждая итерация возвращает весь фрейм данных с соответствующим столбцом (colname
), замененным на множитель. Но каждая итерация перезаписывает предыдущую, поэтому эта функция возвращает только последний результат i
. Как мне убедиться, что у меня получился один фрейм данных, в котором сохранены все соответствующие столбцы?
Пример данных (обязательно закомментируйте первую строку функции выше, так как здесь мы определяем t
):
d <- data.frame("id" = sample(100:999, 10), "age" = sample(18:80, 10), "factor1" = c(rep("a", 3), rep("b", 3), rep("c", 4)), "factor2" = c("x","y","y","y","y","x","x","x","x","y"), stringsAsFactors = FALSE)
t <- data.frame("Item" = c("factor1","factor2"), "Label" = c("This is factor 1", "This is factor 2"), "level1" = c("a","x"), "level2" = c("b","y"), "level3" = c("c","NA"))