데이터 프레임에서 숫자 열만 선택


189

다음과 같이 data.frame이 있다고 가정하십시오.

x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])

x에서 숫자 인 열만 어떻게 선택 하시겠습니까?

답변:


289

편집 : 잘못된 조언을 사용하지 않도록 업데이트되었습니다 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)

10
x[nums]또는 x[sapply(x,is.numeric)]잘 작동합니다. 그리고 그들은 항상 돌아옵니다 data.frame. 비교 x[1]x[,1]- 첫 번째 data.frame두 번째 벡터이다. 변환을 방지하려면을 사용해야 x[, 1, drop=FALSE]합니다.
Marek

연속 데이터 만 선택할 수있는 방법이 있습니까? 이 메소드는 정수뿐만 아니라 연속을 리턴합니다.
Derelict

숫자 열이 없으면 다음과 같은 오류가 발생합니다 undefined columns selected. 어떻게 피합니까?
요한 오바 디아

@SoilSciGuy 연속 데이터는 숫자가 같아야합니다. 아마도 숫자 형식의 요인 데이터가 있습니까? 새로운 질문을 열어야합니다.
Brandon Bertelsen

1
@YohanObadia tryCatch()이 문제를 해결 하기 위해 a 를 사용할 수 있습니다 . 새로운 질문을 열어보십시오.
Brandon Bertelsen

79

dplyr 패키지의 select_if() 기능은 우아한 솔루션입니다.

library("dplyr")
select_if(x, is.numeric)

44

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 배 빠름)를 반환합니다 .


숫자 열이 없으면이 솔루션이 실패하지 않습니다. 그것을 사용하는 데 단점이 있습니까?
bli

필터는 열이 아닌 데이터 프레임의 행에만 적용됩니다. 따라서이 솔루션은 올바른 결과를 제공하지 않습니다.
Michael

4
@Michael은 기본 패키지의 필터와 dplyr 패키지의 필터를 혼동하지 않습니다!
Kevin Zarca

1
@ bli 필터 사용의 단점을 볼 수 없습니다. 입력은 data.frame 객체이며 data.frame을 반환합니다.
Kevin Zarca

참조를 위해 여기에 chiming하십시오. 여기서 Filter()작동하지 않는 것은 교체하는 Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)것입니다. 예를 들어 작동하지 않습니다.
Mobeus Zoom

8

열 이름에만 관심이있는 경우 다음을 사용하십시오.

names(dplyr::select_if(train,is.numeric))

5

이것은 다른 답변에 대한 대체 코드입니다.

x[, sapply(x, class) == "numeric"]

data.table

x[, lapply(x, is.numeric) == TRUE, with = FALSE]

3
이것은 고유 답변이 아닌 선택된 답변에 대한 의견입니다.
Brandon Bertelsen

2
열은 둘 이상의 클래스를 가질 수 있습니다.
Rich Scriven


2

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)

2

다른 방법은 다음과 같습니다.

#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])

1
안녕하세요 Ayushi, 이것은 첫 번째 대답의 반복이기 때문에 아마도 하향 투표되었지만이 방법에는 몇 가지 문제가 있습니다. 첫 번째 답변의 의견을 살펴보면 무슨 뜻인지 알 수 있습니다.
Brandon Bertelsen

1

요인 변수가 많은 경우 다음을 사용할 수 있습니다. select_if 함수 . dplyr 패키지를 설치하십시오. 조건을 만족하여 데이터를 분리하는 많은 기능이 있습니다. 조건을 설정할 수 있습니다.

이렇게 사용하십시오.

categorical<-select_if(df,is.factor)
str(categorical)

2
이 이전 답변의 복제본처럼 보입니다. stackoverflow.com/a/40808873/170352
Brandon Bertelsen

0

이것은 질문에 직접 대답하지는 않지만 특히 id 열과 종속 변수를 제외한 모든 숫자 열과 같은 것을 원하는 경우 매우 유용 할 수 있습니다.

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))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.