답변:
편집 : 잘못된 조언을 사용하지 않도록 업데이트되었습니다 sapply
.
데이터 프레임은리스트이므로리스트 적용 함수를 사용할 수 있습니다.
nums <- unlist(lapply(x, is.numeric))
그런 다음 표준 하위 설정
x[ , nums]
## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)
좀 더 관용적 인 현대식 R을 위해 지금 추천합니다
x[ , purrr::map_lgl(x, is.numeric)]
코드가 적고 R의 특정 단점을 반영하지 않으며 데이터베이스를 기반으로 한 티블에서 사용하기에 더 간단하고 강력합니다.
dplyr::select_if(x, is.numeric)
undefined columns selected
. 어떻게 피합니까?
tryCatch()
이 문제를 해결 하기 위해 a 를 사용할 수 있습니다 . 새로운 질문을 열어보십시오.
Filter()
기본 패키지에서 해당 유스 케이스에 대한 완벽한 기능은 다음과 같습니다.
Filter(is.numeric, x)
또한 다음보다 훨씬 빠릅니다 select_if()
.
library(microbenchmark)
microbenchmark(
dplyr::select_if(mtcars, is.numeric),
Filter(is.numeric, mtcars)
)
는 내 컴퓨터에서 60 마이크로 초의 중간 값을 반환 Filter
하고 21 000 마이크로 초 select_if
(350 배 빠름)를 반환합니다 .
Filter()
작동하지 않는 것은 교체하는 Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
것입니다. 예를 들어 작동하지 않습니다.
열 이름에만 관심이있는 경우 다음을 사용하십시오.
names(dplyr::select_if(train,is.numeric))
이것은 다른 답변에 대한 대체 코드입니다.
x[, sapply(x, class) == "numeric"]
와 data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
PCAmixdata 라이브러리에는 아래와 같이 주어진 데이터 프레임 "YourDataframe"의 정량적 (수치 적 데이터)과 질적 (범용 적 데이터)을 분할하는 functon splitmix가 있습니다.
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)
다른 방법은 다음과 같습니다.
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
요인 변수가 많은 경우 다음을 사용할 수 있습니다. select_if
함수 . dplyr 패키지를 설치하십시오. 조건을 만족하여 데이터를 분리하는 많은 기능이 있습니다. 조건을 설정할 수 있습니다.
이렇게 사용하십시오.
categorical<-select_if(df,is.factor)
str(categorical)
x[nums]
또는x[sapply(x,is.numeric)]
잘 작동합니다. 그리고 그들은 항상 돌아옵니다data.frame
. 비교x[1]
대x[,1]
- 첫 번째data.frame
두 번째 벡터이다. 변환을 방지하려면을 사용해야x[, 1, drop=FALSE]
합니다.