Подтвердить что ты не робот

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

У меня есть пример фрейма данных, как показано ниже:

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

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

4b9b3361

Ответ 1

Выберите некоторые столбцы, чтобы привести к факторам:

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

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

data[cols] <- lapply(data[cols], factor)  ## as.factor() could also be used

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

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

Ответ 2

Здесь используется опция 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 и назначить (:=) значение rhs для "cols"

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

Ответ 3

Более поздним способом 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

Ответ 5

Вы можете использовать mutate_if (dplyr):

Например, приведите integer в factor:

mydata=structure(list(a = 1:10, b = 1:10, c = c("a", "a", "b", "b", 
"c", "c", "c", "c", "c", "c")), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

# A tibble: 10 x 3
       a     b c    
   <int> <int> <chr>
 1     1     1 a    
 2     2     2 a    
 3     3     3 b    
 4     4     4 b    
 5     5     5 c    
 6     6     6 c    
 7     7     7 c    
 8     8     8 c    
 9     9     9 c    
10    10    10 c   

Используйте функцию:

library(dplyr)

mydata%>%
    mutate_if(is.integer,as.factor)

# A tibble: 10 x 3
       a     b c    
   <fct> <fct> <chr>
 1     1     1 a    
 2     2     2 a    
 3     3     3 b    
 4     4     4 b    
 5     5     5 c    
 6     6     6 c    
 7     7     7 c    
 8     8     8 c    
 9     9     9 c    
10    10    10 c    

Ответ 6

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

### 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]

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

Ответ 7

Вот пример data.table. В этом примере я использовал grep потому что часто выбираю много столбцов, используя частичные совпадения с их именами.

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

factorCols <- grep(pattern = "A|C|D|H", x = names(data), value = TRUE)

data[, (factorCols) := lapply(.SD, as.factor), .SDcols = factorCols]

Ответ 8

Чтобы добавить ответ Рича Скривена, у меня было слишком много столбцов, и я не хотел называть их все. В итоге я использовал индексы, такие как в примере ниже:

cols <- c (2, 5, 7, 14:16)

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