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:
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:
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)
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:
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.
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:
unclass
użyjdata.frame
na wyniku.Odpowiedzi:
Witam w świecie R.
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
źródło
mydf$col_names[i]
niemydf[,col_names[i]]
działa, ani nie działa).mydf[, col_names]
zrobi toWyjaś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ętlalapply
. Powyższe przypisanie utworzy zestaw list, które funkcjadata.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:
źródło
length(col_names)==1
. W takim przypadkudf[,col_names]
jest automatycznie degradowany do wektora zamiast listy o długości 1, a następnielapply
próbuje wykonać operacje na każdym wpisie, a nie na całej kolumnie. Można temu zapobiec, używającdf[,col_names,drop=FALSE]
.df[col_names]
.Możesz użyć
dplyr::mutate_if()
do konwersji wszystkich kolumn znaków lubdplyr::mutate_at()
do wybrania nazwanych kolumn znaków na współczynniki:źródło
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
:Spowoduje to utworzenie wektora określającego, które kolumny są klasowe
character
, a następnie zastosujeas.factor
do tych kolumn.Przykładowe dane:
źródło
stringsAsFactors = TRUE
, ale ta jest przydatna, gdy powiedzmy, czytałeś dane zeread_excel()
zreadxl
opakowania i chcą trenować losowy modelu lasu, który nie akceptuje zmienne znakowe.Innym krótkim sposobem, którego możesz użyć, jest pipe (
%<>%
) z pakietu magrittr . Konwertuje kolumnę znaku mycolumn na współczynnik.źródło
Robiłem to z funkcją. W tym przypadku zmienię tylko zmienne znakowe na czynniki:
źródło
[[i]]