Преобразовать формат столбца data.frame из символа в фактор - PullRequest
127 голосов
/ 12 февраля 2012

Я хотел бы изменить формат (класс) некоторых столбцов моего объекта data.frame (mydf) с charactor на фактор .

Я не хочу делать это, когда читаю текстовый файл с помощью функции read.table().

Любая помощь будет оценена.

Ответы [ 6 ]

172 голосов
/ 12 февраля 2012

Привет, добро пожаловать в мир R.

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 I 'Предлагаю вам взглянуть на эти два веб-сайта:

Справочные руководства: http://cran.r -project.org / manuals.html

R Справочная карточка: http://cran.r -project.org / doc / contrib / Short-refcard.pdf

76 голосов
/ 13 февраля 2012
# 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)
17 голосов
/ 10 апреля 2018

Вы можете использовать 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)
14 голосов
/ 08 января 2016

Если вы хотите заменить все символьные переменные в вашем 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
                  )
10 голосов
/ 24 июня 2016

Еще один короткий способ, которым вы можете воспользоваться, - это труба (%<>%) из пакета magrittr . Он преобразует столбец символов mycolumn в коэффициент.

library(magrittr)

mydf$mycolumn %<>% factor
3 голосов
/ 02 июня 2017

Я делаю это с помощью функции.В этом случае я буду преобразовывать только символьные переменные в множители:

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