Załóżmy, że masz plik data.frame taki jak ten:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Jak wybrałbyś tylko te kolumny w x, które są numeryczne?
Załóżmy, że masz plik data.frame taki jak ten:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Jak wybrałbyś tylko te kolumny w x, które są numeryczne?
Odpowiedzi:
EDYCJA: zaktualizowano, aby uniknąć użycia niewłaściwego doradztwa sapply
.
Ponieważ ramka danych jest listą, możemy użyć funkcji zastosowania listy:
nums <- unlist(lapply(x, is.numeric))
Następnie standardowe podzbiór
x[ , nums]
## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)
Dla bardziej idiomatycznego nowoczesnego R. poleciłbym teraz
x[ , purrr::map_lgl(x, is.numeric)]
Mniej kluczowania, mniej odzwierciedlające szczególne dziwactwa R, a także prostsze i solidniejsze w użyciu w bazach danych opartych na bazie danych:
dplyr::select_if(x, is.numeric)
undefined columns selected
. Jak tego uniknąć?
tryCatch()
sobie z tym poradzić. Proszę rozważyć otwarcie nowego pytania.
Filter()
z pakietu podstawowego jest idealną funkcją dla tego przypadku użycia: po prostu musisz zakodować:
Filter(is.numeric, x)
Jest także znacznie szybszy niż select_if()
:
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
zwraca (na moim komputerze) medianę 60 mikrosekund dla Filter
i 21 000 mikrosekund dla select_if
(350x szybciej).
Filter()
nie działa, to zamiana, np. Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
Nie zadziała.
jeśli interesują Cię tylko nazwy kolumn, użyj tego:
names(dplyr::select_if(train,is.numeric))
To alternatywny kod do innych odpowiedzi:
x[, sapply(x, class) == "numeric"]
z data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
library(purrr)
x <- x %>% keep(is.numeric)
Biblioteka PCAmixdata ma funkcję splitmix, która dzieli ilościową (dane liczbowe) i jakościową (dane kategorialne) daną ramkę danych „YourDataframe”, jak pokazano poniżej:
install.packages("PCAmixdata")
library(PCAmixdata)
split <- splitmix(YourDataframe)
X1 <- split$X.quanti(Gives numerical columns in the dataset)
X2 <- split$X.quali (Gives categorical columns in the dataset)
Innym sposobem może być:
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
Jeśli masz wiele zmiennych czynnikowych, możesz użyć select_if
funkcji funtion. zainstaluj pakiety dplyr. Istnieje wiele funkcji oddzielających dane poprzez spełnienie warunku. możesz ustawić warunki.
Użyj w ten sposób.
categorical<-select_if(df,is.factor)
str(categorical)
To nie odpowiada bezpośrednio na pytanie, ale może być bardzo przydatne, szczególnie jeśli potrzebujesz czegoś takiego jak wszystkie kolumny numeryczne z wyjątkiem kolumny id i zmiennej zależnej.
numeric_cols <- sapply(dataframe, is.numeric) %>% which %>%
names %>% setdiff(., c("id_variable", "dep_var"))
dataframe %<>% dplyr::mutate_at(numeric_cols, function(x) your_function(x))
x[nums]
lub teżx[sapply(x,is.numeric)]
działa. I zawsze wracajądata.frame
. Porównajx[1]
vsx[,1]
- po pierwszedata.frame
, drugi to wektor. Jeśli chcesz zapobiec konwersji, musisz użyćx[, 1, drop=FALSE]
.