wake-up-neo.com

Erzwingen Sie mehrere Spalten gleichzeitig auf Faktoren

Ich habe einen Beispieldatenrahmen wie folgt:

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

Ich möchte wissen, wie ich mehrere Spalten auswählen und sie in Faktoren umwandeln kann. Normalerweise mache ich es so wie data$A = as.factor(data$A). Wenn der Datenrahmen jedoch sehr groß ist und viele Spalten enthält, ist dieser Weg sehr zeitaufwändig. Kennt jemand einen besseren Weg, um es zu tun? 

50
wsda

Wählen Sie einige Spalten aus, um Faktoren zu erzwingen:

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

Verwenden Sie lapply(), um die ausgewählten Spalten zu erzwingen und zu ersetzen:

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

Überprüfen Sie das Ergebnis:

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

Hier ist eine Option mit dplyr. Der %<>%-Operator von magrittr aktualisiert das lhs-Objekt mit dem resultierenden Wert.

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

Wenn wir data.table verwenden, verwenden Sie entweder eine for-Schleife mit set

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

Oder wir können die 'cols' in .SDcols angeben und (r:=) die rhs den 'cols' zuweisen

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

Der neuere tidyverse-Weg ist die Verwendung der mutate_at-Funktion:

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
16
Yun Ching

und zur Vollständigkeit und in Bezug auf diese Frage, die nur zum Ändern von String-Spalten auffordert , gibt es 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(.)))
5
Janna Maas

Sie können mutate_if (dplyr) verwenden:

Zum Beispiel integer in 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   

Verwenden Sie die Funktion:

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    
0
user108927

Wenn Sie ein anderes Ziel haben, Werte aus der Tabelle zu übernehmen und diese dann zu konvertieren, können Sie den folgenden Weg versuchen

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

Dadurch werden Spalten ausgewählt, die speziell zeichenbasiert sind, und konvertiert sie dann in Faktor.

0
user9333657

Hier ist ein data.table Beispiel. In diesem Beispiel habe ich grep verwendet, da ich häufig viele Spalten auswähle, indem ich teilweise Übereinstimmungen mit ihren Namen verwende.

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]
0
Kayle Sawyer