Перетворити формат стовпців data.frame з символу в фактор


153

Я хотів би змінити формат (клас) деяких стовпців мого data.frame object ( mydf) з charactor на factor .

Я не хочу цього робити, коли читаю текстовий файл за read.table()функціями.

Будь-яка допомога буде вдячна.


12
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn)
tim riffe

Дякую! але у мене є інша проблема. У мене є ім'я кожного стовпця в масиві символів col_names []. Як я можу використовувати вищевказану команду (mydf $ col_names [i]) не працює.
Расуль

Будь-який спосіб зробити це автоматично для всіх змінних символів, оскільки data.frame робить це за допомогою stringsAsFactors?
Etienne Low-Decarie

@ EtienneLow-Décarie: просто unclassта використовуй data.frameрезультат,
IRTFM

Відповіді:


197

Привіт, ласкаво просимо у світ Р.

mtcars  #look at this built in data set
str(mtcars) #allows you to see the classes of the variables (all numeric)

#one approach it to index with the $ sign and the as.factor function
mtcars$am <- as.factor(mtcars$am)
#another approach
mtcars[, 'cyl'] <- as.factor(mtcars[, 'cyl'])
str(mtcars)  # now look at the classes

Це також працює для символів, дат, цілих чисел та інших класів

Оскільки ви новачок у R, я б запропонував вам переглянути ці два веб-сайти:

Довідкові посібники: http://cran.r-project.org/manuals.html

R Довідкова картка: http://cran.r-project.org/doc/contrib/Short-refcard.pdf


Дякую! але у мене є інша проблема. У мене є ім'я кожного стовпця в масиві символів col_names []. Як я можу використовувати вищезазначену команду ( mydf$col_names[i]ні mydf[,col_names[i]]працює, ні працює.)
Расуль,

1
@Rasoul, mydf[, col_names]зробить це
DrDom

3
+1 для відповідей. Це основні речі, про які варто запитати, але також добре розуміти велику роботу, яка була вкладена в ці (і подібні) роботи.
Роман Луштрик

84
# To do it for all names
df[] <- lapply( df, factor) # the "[]" keeps the dataframe structure
 col_names <- names(df)
# do do it for some names in a vector named 'col_names'
df[col_names] <- lapply(df[col_names] , factor)

Пояснення. Усі фрейми даних - це списки, а результати [використовуваних з декількома значеннями аргументів також є списками, тому завдання циклічного перегляду списків є завданням lapply. Вищевказане призначення створить набір списків, які функція data.frame.[<-повинна успішно вставляти в рамку даних,df

Іншою стратегією було б перетворення лише тих стовпців, де кількість унікальних елементів менша за якийсь критерій, скажімо, менша, ніж журнал кількості рядків як приклад:

cols.to.factor <- sapply( df, function(col) length(unique(col)) < log10(length(col)) )
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor)

Це дуже приємне рішення! Він також може працювати з номерами стовпців, які можуть бути особливо корисними, якщо ви хочете змінити багато, але не всі. Наприклад, col_nums <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57), то df [, col_nums] <- lapply (df [, col_nums] , фактор).
WGray

Caveat: перше рішення не працює, якщо length(col_names)==1. У цьому випадку df[,col_names]автоматично переноситься на вектор замість списку довжиною 1, а потім lapplyнамагається діяти над кожним записом, а не стовпцем в цілому. Це можна запобігти за допомогою використання df[,col_names,drop=FALSE].
П Шнелл

Це хороший момент. Інше виклик, який би зберігав статус списку, - це використовувати df[col_names].
IRTFM

27

Ви можете використовувати dplyr::mutate_if()для перетворення всіх стовпців символів або dplyr::mutate_at()для вибору іменних стовпців символів у фактори:

library(dplyr)

# all character columns to factor:
df <- mutate_if(df, is.character, as.factor)

# select character columns 'char1', 'char2', etc. to factor:
df <- mutate_at(df, vars(char1, char2), as.factor)

18

Якщо ви хочете змінити всі змінні символів у вашому data.frame на фактори після того, як ви вже завантажили свої дані, ви можете це зробити так, як у data.frame з назвою dat:

character_vars <- lapply(dat, class) == "character"
dat[, character_vars] <- lapply(dat[, character_vars], as.factor)

Це створює вектор, який визначає, які стовпці класу character, а потім застосовується as.factorдо цих стовпців.

Приклад даних:

dat <- data.frame(var1 = c("a", "b"),
                  var2 = c("hi", "low"),
                  var3 = c(0, 0.1),
                  stringsAsFactors = FALSE
                  )

Повне перетворення кожної символьної змінної до фактору , як правило , відбувається при читанні даних, наприклад, з stringsAsFactors = TRUE, але це корисно , коли , скажімо, ви читали дані з read_excel()з readxlпакета і хочете навчити модель випадкового лісу , який не приймає символьні змінні.
Сем Фірке

13

Ще один короткий спосіб, який ви можете використовувати, - це труба ( %<>%) з пакету magrittr . Він перетворює мій стовпець стовпця символів у фактор.

library(magrittr)

mydf$mycolumn %<>% factor

Відредагуйте додаткові відомості. Відповіді, що містять лише коди, та "спробувати це" не рекомендують, оскільки вони не містять вмісту, який можна шукати, і не пояснюють, чому хтось повинен "спробувати це". Ми докладаємо зусиль, щоб бути ресурсом для знань.
Брайан Томпсетт - 汤 莱恩

pls, якщо я хочу використовувати його для всіх стовпців мого df?
Мостафа

5

Я роблю це з функцією. У цьому випадку я перетворять лише змінні символи у фактор:

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}

Я вважаю, що вам потрібні подвійні дужки, щоб фактично [[i]]
дістати
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.