Angenommen, Sie haben einen data.frame wie folgt:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Wie würden Sie nur die Spalten in x auswählen, die numerisch sind?
Angenommen, Sie haben einen data.frame wie folgt:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Wie würden Sie nur die Spalten in x auswählen, die numerisch sind?
Antworten:
BEARBEITEN: aktualisiert, um die Verwendung von schlecht beratenen zu vermeiden sapply
.
Da ein Datenrahmen eine Liste ist, können wir die Listenanwendungsfunktionen verwenden:
nums <- unlist(lapply(x, is.numeric))
Dann Standard-Teilmenge
x[ , nums]
## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)
Für ein idiomatischeres modernes R würde ich jetzt empfehlen
x[ , purrr::map_lgl(x, is.numeric)]
Weniger Codey, weniger Reflexion der besonderen Macken von R und unkomplizierter und robuster für Datenbank-Back-Ended-Tibbles:
dplyr::select_if(x, is.numeric)
undefined columns selected
. Wie vermeidest du das?
tryCatch()
um damit umzugehen. Bitte erwägen Sie, eine neue Frage zu öffnen.
Filter()
aus dem Basispaket ist die perfekte Funktion für diesen Anwendungsfall: Sie müssen einfach codieren:
Filter(is.numeric, x)
Es ist auch viel schneller als select_if()
:
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
gibt (auf meinem Computer) einen Median von 60 Mikrosekunden für Filter
und 21 000 Mikrosekunden für select_if
(350x schneller) zurück.
Filter()
hier nicht funktioniert, ist Ersetzen, z Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
. B. nicht.
Wenn Sie nur an Spaltennamen interessiert sind, verwenden Sie diese:
names(dplyr::select_if(train,is.numeric))
Dies ist ein alternativer Code zu anderen Antworten:
x[, sapply(x, class) == "numeric"]
mit einer data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
library(purrr)
x <- x %>% keep(is.numeric)
Die Bibliothek PCAmixdata verfügt über eine Funktion splitmix, die quantitative (numerische Daten) und qualitative (kategoriale Daten) eines bestimmten Datenrahmens "YourDataframe" wie unten gezeigt aufteilt:
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)
Ein anderer Weg könnte wie folgt sein:
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
Wenn Sie viele Faktorvariablen haben, können Sie verwenden select_if
. Installieren Sie die dplyr-Pakete. Es gibt viele Funktionen, die Daten trennen, indem sie eine Bedingung erfüllen. Sie können die Bedingungen festlegen.
Verwenden Sie so.
categorical<-select_if(df,is.factor)
str(categorical)
Dies beantwortet die Frage nicht direkt, kann jedoch sehr nützlich sein, insbesondere wenn Sie so etwas wie alle numerischen Spalten mit Ausnahme Ihrer ID-Spalte und der abhängigen Variablen möchten.
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]
oderx[sapply(x,is.numeric)]
funktioniert auch. Und sie kehren immer zurückdata.frame
. Vergleichex[1]
vsx[,1]
- erstens istdata.frame
, zweitens ist ein Vektor. Wenn man eine Konvertierung verhindern will, muss man verwendenx[, 1, drop=FALSE]
.