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?
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"
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]
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
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(.)))
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
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.
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]