2017-02-20 5 views
1

У меня есть вектор символов классов, которые я хотел бы применить к кадру данных, чтобы преобразовать текущий класс каждого поля в этом фрейме данных в соответствующую запись в векторе. Например:Применение вектора классов к dataframe

frame <- data.frame(A = c(2:5), B = c(3:6)) 
classes <- c("character", "factor") 

С помощью петли, я знаю, что это может быть выполнено с использованием lapply. Например:

for(i in 1:2) { frame[i] <- lapply(frame[i], paste("as", classes[i], sep = ".")) } 

Для моих целей, однако, для цикла не может работать. Есть ли еще одно решение, которое мне не хватает?

Заранее благодарю за ваш ввод!

Примечание: Мне сообщили, что это может быть дубликат this post. И, да, мой вопрос подобен этому. Но я раньше рассматривал подход class(). И это, похоже, не эффективно справляется с преобразованием полей в факторы. С другой стороны, сдержанный подход делает это хорошо. Но, к сожалению, я не могу использовать for-loop в этом случае

+0

Что является источником данных? Почему вы не применяете классы при чтении данных вместо их применения позже? – A5C1D2H2I1M1N2O1R2T1

+0

Также вы можете использовать 'lapply' без явного цикла' for'? Подобно 'frame [] <- lapply (seq_along (frame), function (x) {FUN <- paste (" as ", classes [x], sep =". "); Match.fun (FUN) (frame [[ x]])}) '? – A5C1D2H2I1M1N2O1R2T1

ответ

0

Если вы не прочь использовать lapply без цикла for, вы можете попробовать что-то вроде следующего.

frame[] <- lapply(seq_along(frame), function(x) { 
    FUN <- paste("as", classes[x], sep = ".") 
    match.fun(FUN)(frame[[x]]) 
}) 

str(frame) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: chr "2" "3" "4" "5" 
# $ B: Factor w/ 4 levels "3","4","5","6": 1 2 3 4 

Однако лучше всего попытаться применить правильные классы, когда вы читаете данные для начала.

x <- tempfile()       # Just to pretend.... 
write.csv(frame2, x, row.names = FALSE) # ... that we are reading a csv 

frame3 <- read.csv(x, colClasses = classes) 

str(frame3) 
# 'data.frame': 4 obs. of 2 variables: 
# $ A: chr "2" "3" "4" "5" 
# $ B: Factor w/ 4 levels "3","4","5","6": 1 2 3 4 

Образец данных:

frame <- frame2 <- data.frame(A = c(2:5), B = c(3:6)) 
classes <- c("character", "factor") 
+0

Спасибо большое! Такой подход работал отлично. Я создаю приложение Shiny, которое частично позволит пользователю загрузить файл данных и указать желаемый тип класса для каждой переменной в этом файле. Сочетание вашего кода с функцией isolate() делает трюк. – lombax2019

Смежные вопросы