2012-02-12 11 views
94

Programuję w języku R. Chciałbym zmienić format (klasa) niektórych kolumn mojego obiektu data.frame (mydf) z charactor na czynnik. Nie chcę tego robić, gdy czytam plik tekstowy przez funkcję read.table(). Każda pomoc będzie doceniona.Konwertuj format kolumny danych.frame z postaci na czynnik

+6

mydf $ myfavoritecolumn <- as.factor (mydf $ myfavoritecolumn) –

+0

Dziękujemy! ale mam inny problem. Mam nazwę każdej kolumny w tablicy znaków col_names []. Jak korzystać z powyższego polecenia (mydf $ col_names [i]) nie działa. – Rasoul

+0

W jaki sposób można to zrobić automatycznie dla wszystkich zmiennych znakowych, ponieważ data.frame robi to z ciągami znakówSsFactors? –

Odpowiedz

133

Cześć witamy 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 

ta działa również w charakterze, dat, liczb i innych klas

Ponieważ jesteś nowy R Sugeruję masz spojrzeć na tych dwóch stronach internetowych:

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

R Reference kartka:http://cran.r-project.org/doc/contrib/Short-refcard.pdf

+0

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]' ani 'mydf [, col_names [i]]' nie działa.) – Rasoul

+0

@Rasoul, 'mydf [, col_names]' zrobi to – DrDom

+1

+ 1 dla ref. Jest to podstawowa kwestia, o którą można zapytać, ale dobrze jest też mieć świadomość ogromnej pracy, która została włożona w te (i podobne) prace. –

67
# 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żywane z argumentami o wielu wartościach są również listami, więc zapętlenie list jest zadaniem lapply. Powyższe zadanie będzie utworzyć zestaw list, że funkcja data.frame.[<- powinny skutecznie przykleić z powrotem do dataframe, df

Inną strategią byłoby przekształcić tylko te kolumny, gdzie liczba unikalnych przedmiotów jest mniejsza od pewnego kryterium, powiedzmy, mniej niż logarytmu liczby wierszy jako 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) 
+0

Każdy z nich powinien działać. Właśnie sfałszowałem twoje stwierdzenie, że "musi być" tak, jak mówisz, próbując z 'imionami <- c ('vs', 'am', 'gear'); mtcars [, nazwy] <- lapply (mtcars [, names], factor) '.. Może powinieneś być bardziej ostrożny z krytyką swoich starszych. –

+0

To bardzo dobre 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. Col_nums <- c (1, 6, 7: 9, 21:23, 27:28, 30:31, 39, 49:55, 57), a następnie df [, col_nums] <- lapply (df [, col_nums] czynnik). – WGray

+0

Zastrzeżenie: pierwsze rozwiązanie nie działa, jeśli "length (col_names) == 1'. W takim przypadku 'df [, col_names]' jest automatycznie degradowane do wektora zamiast do listy o długości 1, a następnie 'lapply' próbuje działać na każdym wpisie, a nie na kolumnie jako całości. Można temu zapobiec, używając 'df [, col_names, drop = FALSE]'. –

9

Jeśli chcesz zmienić wszystkie zmienne znak w data.frame czynników po już załadowane dane, można 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) 

To tworzy wektor określający, które kolumny są klasy character, a następnie stosuje as.factor do tych kolumn.

dane próbki:

dat <- data.frame(var1 = c("a", "b"), 
        var2 = c("hi", "low"), 
        var3 = c(0, 0.1), 
        stringsAsFactors = FALSE 
       ) 
+0

Pełna konwersja każdej zmiennej znakowej do czynnika zwykle dzieje się podczas odczytu w danych, np. Z 'stringamiAsFactors = TRUE', ale jest to przydatne, gdy mówisz, czytałeś dane z' read_excel() 'z' readxl' pakiet i chcesz wytrenować losowy model lasu, który nie akceptuje zmiennych znaków. –

5

Kolejny krótki sposób można użyć jest rura (%<>%) od magrittr opakowaniu. Konwertuje kolumnę znaków mycolumn na współczynnik.

library(magrittr) 

mydf$mycolumn %<>% factor 
+0

Edytuj i uzyskaj więcej informacji. Tylko kod i odpowiedź "spróbuj tego" są odradzane, ponieważ nie zawierają treści do wyszukiwania i nie wyjaśniają, dlaczego ktoś powinien "spróbować tego". Staramy się być źródłem wiedzy. –

+0

pls, jeśli chcę go używać do wszystkich kolumn mojego df? –

1

Robię to z funkcją. W tym przypadku będę przekształcić tylko zmienne znakowe czynnik:

for (i in 1:ncol(data)){ 
    if(is.character(data[,i])){ 
     data[,i]=factor(data[,i]) 
    } 
} 
Powiązane problemy