Suponha que você tenha um data.frame assim:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Como você selecionaria apenas as colunas em x que são numéricas?
Suponha que você tenha um data.frame assim:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
Como você selecionaria apenas as colunas em x que são numéricas?
Respostas:
EDIT: atualizado para evitar o uso de imprudentes sapply
.
Como um quadro de dados é uma lista, podemos usar as funções de aplicação de lista:
nums <- unlist(lapply(x, is.numeric))
Subconjunto padrão
x[ , nums]
## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)
Para um R moderno mais idiomático, eu recomendaria agora
x[ , purrr::map_lgl(x, is.numeric)]
Menos codey, menos refletindo as peculiaridades particulares de R, e mais direto e robusto para usar em rabiscos de banco de dados:
dplyr::select_if(x, is.numeric)
undefined columns selected
. Como você evita isso?
tryCatch()
para lidar com isso. Por favor, considere abrir uma nova pergunta.
Filter()
do pacote base é a função perfeita para esse caso de uso: você simplesmente precisa codificar:
Filter(is.numeric, x)
Também é muito mais rápido que select_if()
:
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
retorna (no meu computador) uma mediana de 60 microssegundos por Filter
e 21 000 microssegundos por select_if
(350x mais rápido).
Filter()
que não funciona aqui é substituir, por exemplo Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
, não funciona.
caso você esteja interessado apenas nos nomes das colunas, use o seguinte:
names(dplyr::select_if(train,is.numeric))
Este é um código alternativo para outras respostas:
x[, sapply(x, class) == "numeric"]
com um data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
library(purrr)
x <- x %>% keep(is.numeric)
A biblioteca PCAmixdata possui functon splitmix que divide quantitativos (dados numéricos) e qualitativos (dados categóricos) de um determinado quadro de dados "YourDataframe", como mostrado abaixo:
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)
Outra maneira poderia ser a seguinte:
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
Se você tiver muitas variáveis de fator, poderá usar a select_if
função instale os pacotes dplyr. Existem muitas funções que separam dados satisfazendo uma condição. Você pode definir as condições.
Use assim.
categorical<-select_if(df,is.factor)
str(categorical)
Isso não responde diretamente à pergunta, mas pode ser muito útil, especialmente se você deseja algo como todas as colunas numéricas, exceto a coluna id e a variável dependente.
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]
oux[sapply(x,is.numeric)]
funciona também. E eles sempre retornamdata.frame
. Comparex[1]
vsx[,1]
- primeiro édata.frame
, o segundo é um vetor. Se alguém quiser impedir a conversão, deve usarx[, 1, drop=FALSE]
.