Konwertuj format kolumny data.frame ze znaku na współczynnik

153

Chciałbym zmienić format (klasę) niektórych kolumn mojego obiektu data.frame ( mydf) ze znaku na czynnik .

Nie chcę tego robić, gdy czytam plik tekstowy według read.table()funkcji.

Każda pomoc będzie mile widziana.

Rasoul
źródło
12
mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn)
tim riffe
Dzięki! ale mam inny problem. Mam nazwę każdej kolumny w tablicy znaków col_names []. Jak mogę użyć powyższego polecenia (mydf $ col_names [i]) nie działa.
Rasoul
Czy jest jakiś sposób, aby zrobić to automatycznie dla wszystkich zmiennych znakowych, ponieważ data.frame robi to z ciągami znaków?
Etienne Low-Décarie
@ EtienneLow-Décarie: po prostu unclassużyj data.framena wyniku.
IRTFM

Odpowiedzi:

197

Witam w świecie 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

Działa to również w przypadku znaków, dat, liczb całkowitych i innych klas

Ponieważ nie znasz języka R, sugeruję, abyś przyjrzał się tym dwóm stronom internetowym:

Podręczniki referencyjne R: http://cran.r-project.org/manuals.html

R Karta referencyjna: http://cran.r-project.org/doc/contrib/Short-refcard.pdf

Tyler Rinker
źródło
Dzięki! ale mam inny problem. Mam nazwę każdej kolumny w tablicy znaków col_names []. Jak mogę użyć powyższego polecenia (ani mydf$col_names[i]nie mydf[,col_names[i]]działa, ani nie działa).
Rasoul
1
@Rasoul, mydf[, col_names]zrobi to
DrDom
3
+1 dla sędziów. To są podstawowe rzeczy, o które można zapytać, ale dobrze jest też mieć świadomość obszernej pracy, która została włożona w te (i podobne) prace.
Roman Luštrik
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)

Wyjaśnienie. Wszystkie ramki danych są listami, a wyniki [użycia z argumentami o wielu wartościach są również listami, więc zadaniem list jest pętla lapply. Powyższe przypisanie utworzy zestaw list, które funkcja data.frame.[<-powinna z powodzeniem umieścić z powrotem w ramce danych,df

Inną strategią byłoby przekonwertowanie tylko tych kolumn, w których liczba unikalnych pozycji jest mniejsza niż pewne kryterium, powiedzmy, że jest mniejsza niż dziennik liczby wierszy na przykład:

cols.to.factor <- sapply( df, function(col) length(unique(col)) < log10(length(col)) )
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor)
IRTFM
źródło
To bardzo fajne rozwiązanie! Może również działać z numerami kolumn, co może być szczególnie przydatne, jeśli chcesz zmienić wiele, ale nie wszystkie. Np. Liczba_kol. <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57), a następnie df [, liczba_kol.] <- lapply (df [, liczba_kol.] , czynnik).
WGray
Uwaga: pierwsze rozwiązanie nie działa, jeśli length(col_names)==1. W takim przypadku df[,col_names]jest automatycznie degradowany do wektora zamiast listy o długości 1, a następnie lapplypróbuje wykonać operacje na każdym wpisie, a nie na całej kolumnie. Można temu zapobiec, używając df[,col_names,drop=FALSE].
P Schnell
To dobra uwaga. Innym wywołaniem, które zachowałoby status listy, jest użycie df[col_names].
IRTFM
27

Możesz użyć dplyr::mutate_if()do konwersji wszystkich kolumn znaków lub dplyr::mutate_at()do wybrania nazwanych kolumn znaków na współczynniki:

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
źródło
18

Jeśli chcesz zmienić wszystkie zmienne znakowe w data.frame na współczynniki po załadowaniu danych, możesz to zrobić w ten sposób, do data.frame o nazwie dat:

character_vars <- lapply(dat, class) == "character"
dat[, character_vars] <- lapply(dat[, character_vars], as.factor)

Spowoduje to utworzenie wektora określającego, które kolumny są klasowe character, a następnie zastosuje as.factordo tych kolumn.

Przykładowe dane:

dat <- data.frame(var1 = c("a", "b"),
                  var2 = c("hi", "low"),
                  var3 = c(0, 0.1),
                  stringsAsFactors = FALSE
                  )
Sam Firke
źródło
Pełna konwersja każdej zmiennej znak do czynnika zwykle bywa przy wczytywaniu danych, na przykład, z stringsAsFactors = TRUE, ale ta jest przydatna, gdy powiedzmy, czytałeś dane ze read_excel()z readxlopakowania i chcą trenować losowy modelu lasu, który nie akceptuje zmienne znakowe.
Sam Firke,
13

Innym krótkim sposobem, którego możesz użyć, jest pipe ( %<>%) z pakietu magrittr . Konwertuje kolumnę znaku mycolumn na współczynnik.

library(magrittr)

mydf$mycolumn %<>% factor
chrimuelle
źródło
Edytuj, podając więcej informacji. Odpowiedzi zawierające tylko kod i „wypróbuj to” są odradzane, ponieważ nie zawierają treści, które można przeszukiwać, i nie wyjaśniają, dlaczego ktoś powinien „spróbować tego”. Dokładamy wszelkich starań, aby być źródłem wiedzy.
Brian Tompsett - 汤 莱恩
pls, jeśli nie chcę go używać we wszystkich kolumnach mojego df?
Mostafa
5

Robiłem to z funkcją. W tym przypadku zmienię tylko zmienne znakowe na czynniki:

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}
user3397644
źródło
Uważam, że potrzebujesz podwójnych nawiasów, aby faktycznie wyodrębnić kolumnę i zmienić ją na współczynnik, np.[[i]]
RTrain3k