Преобразовать формат столбца data.frame из символа в фактор

153

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

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

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

Расул
источник
12
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn)
тим рифф
Спасибо! но у меня есть другая проблема. У меня есть имя каждого столбца в массиве символов col_names []. Как я могу использовать вышеупомянутую команду (mydf $ col_names [i]) не работает.
Расул
Любой способ сделать это автоматически для всех символьных переменных, как data.frame делает это с stringsAsFactors?
Этьен Лоу-Декари
@ EtienneLow-Décarie: просто unclassи использовать data.frameна результат.
IRTFM

Ответы:

197

Привет добро пожаловать в мир 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, я бы посоветовал вам взглянуть на эти два сайта:

Справочные руководства 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]]не работает.)
Rasoul
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)
IRTFM
источник
Это очень хорошее решение! Он также может работать с номерами столбцов, что может быть особенно полезно, если вы хотите изменить многие, но не все. Например, 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
Предостережение: первое решение не работает, если 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)
sbha
источник
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

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

library(magrittr)

mydf$mycolumn %<>% factor
chrimuelle
источник
Пожалуйста, отредактируйте с дополнительной информацией. Ответы «только код» и «попробуй это» не приветствуются, поскольку они не содержат контента для поиска и не объясняют, почему кто-то должен «попробовать это». Мы прилагаем все усилия, чтобы быть источником знаний.
Брайан Томпсетт - 莱恩 莱恩
Пожалуйста, если я хочу использовать его для всех столбцов моего DF?
Мостафа
5

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

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}
user3397644
источник
Я считаю, что вам нужны двойные скобки, чтобы фактически извлечь столбец и изменить его на коэффициент, например[[i]]
RTrain3k