2015-10-16 3 views
31

У меня есть кадр данных образца, как показано ниже:принуждать несколько столбцов факторов сразу

data <- data.frame(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10]))) 

Я хочу знать, как я могу выбрать несколько столбцов и преобразовать их вместе факторы. Обычно я делаю это так, как data$A = as.factor(data$A). Но когда кадр данных очень большой и содержит много столбцов, этот способ будет очень трудоемким. Кто-нибудь знает, есть ли какой-нибудь умный способ сделать это?

ответ

48

Выберите несколько столбцов принуждать к факторам:

cols <- c("A", "C", "D", "H") 

Использование lapply() принуждать и заменить выбранные столбцы:

data[cols] <- lapply(data[cols], factor) 

Проверьте результат:

sapply(data, class) 
#  A   B   C   D   E   F   G 
# "factor" "integer" "factor" "factor" "integer" "integer" "integer" 
#  H   I   J 
# "factor" "integer" "integer" 
+0

Не нужно ли это 'data [, cols] <- lapply (data [, cols], factor)' (с ведущей запятой для столбцов)? – Tgsmith61591

+4

@ Tgsmith61591- Это может быть и то. С запятой является подмножеством матричного типа, без запятой - подмножество списка. Кадры данных могут быть подмножеством одного из них, так что любой из них будет работать. –

21

Вот с использованием dplyr. Оператор %<>% от magrittr обновляет объект lhs с полученным значением.

library(magrittr) 
library(dplyr) 
cols <- c("A", "C", "D", "H") 

data %<>% 
     mutate_each_(funs(factor(.)),cols) 
str(data) 
#'data.frame': 4 obs. of 10 variables: 
# $ A: Factor w/ 4 levels "23","24","26",..: 1 2 3 4 
# $ B: int 15 13 39 16 
# $ C: Factor w/ 4 levels "3","5","18","37": 2 1 3 4 
# $ D: Factor w/ 4 levels "2","6","28","38": 3 1 4 2 
# $ E: int 14 4 22 20 
# $ F: int 7 19 36 27 
# $ G: int 35 40 21 10 
# $ H: Factor w/ 4 levels "11","29","32",..: 1 4 3 2 
# $ I: int 17 1 9 25 
# $ J: int 12 30 8 33 

Или, если мы используем data.table, либо использовать for петлю с set

setDT(data) 
for(j in cols){ 
    set(data, i=NULL, j=j, value=factor(data[[j]])) 
} 

Или мы можем указать 'COLS' в .SDcols и назначить (:=) РИТ к ' cols '

setDT(data)[, (cols):= lapply(.SD, factor), .SDcols=cols] 
7

Более поздние tidyverse способ заключается в использовании mutate_at функции:

library(tidyverse) 
library(magrittr) 
set.seed(88) 

data <- data.frame(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10]))) 
cols <- c("A", "C", "D", "H") 

data %<>% mutate_at(cols, funs(factor(.))) 
str(data) 
$ A: Factor w/ 4 levels "5","17","18",..: 2 1 4 3 
$ B: int 36 35 2 26 
$ C: Factor w/ 4 levels "22","31","32",..: 1 2 4 3 
$ D: Factor w/ 4 levels "1","9","16","39": 3 4 1 2 
$ E: int 3 14 30 38 
$ F: int 27 15 28 37 
$ G: int 19 11 6 21 
$ H: Factor w/ 4 levels "7","12","20",..: 1 3 4 2 
$ I: int 23 24 13 8 
$ J: int 10 25 4 33 
3

и, для полноты и в отношении this question asking about changing string columns only, есть mutate_if:

data <- cbind(stringVar = sample(c("foo","bar"),10,replace=TRUE), 
       data.frame(matrix(sample(1:40), 10, 10, dimnames = list(1:10, LETTERS[1:10]))),stringsAsFactors=FALSE)  

factoredData = data %>% mutate_if(is.character,funs(factor(.))) 
0

Если у вас есть другая цель получения значений из таблицу, затем используя их для преобразования, вы можете попробовать следующее:

### pre processing 
ind <- bigm.train[,lapply(.SD,is.character)] 
ind <- names(ind[,.SD[T]]) 
### Convert multiple columns to factor 
bigm.train[,(ind):=lapply(.SD,factor),.SDcols=ind] 

Этот автомобиль ects, которые специфически основаны на символах, а затем преобразуют их в коэффициент.

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