문자열 일치를 기반으로 열 선택-dplyr :: select


83

많은 열이있는 데이터 프레임 ( "데이터")이 있습니다. 일부 열에는 특정 문자열 ( "search_string")이 포함되어 있습니다.

dplyr::select()문자열이 포함 된 열만 포함하는 하위 집합을 제공 하려면 어떻게 해야합니까?

나는 시도했다 :

# columns as boolean vector
select(data, grepl("search_string",colnames(data)))

# columns as vector of column names names 
select(data, colnames(data)[grepl("search_string",colnames(data))]) 

둘 다 작동하지 않습니다.

select()예를 들어 열 대신 숫자 벡터 를 허용 한다는 것을 알고 있습니다.

select(data,5,7,9:20)

하지만 IDgrepl()식에서 열의 숫자 벡터를 얻는 방법을 모르겠습니다 .


또한 여러 문자열과 일치하는 항목이 SO의 답변을 참조하십시오 : stackoverflow.com/q/29018292/3871924이
agenis

답변:


114

dplyr의 세계, 시도 :

select(iris,contains("Sepal"))

의 선택 섹션을 참조하십시오 ?select수많은 다른 도우미가 좋아 위해 starts_with, ends_with


2
정규식을 피하려고 시도하면 정규식이 다시 당신을 깨물기 select(iris, contains(".") )fixed=TRUE"."
때문에이 문제를 쉽게 풀

1
@thelatemail 그것은 코드 나 문서 (즉, 우리가 가정 fixed = TRUE하거나 동등한 것) 에서 감독하는 것처럼 느껴집니다 . dplyr은 아직 꽤 어리다.
joran

@thelatemail 죄송합니다! 그래서 내가했다!
joran

6
글쎄, 그것은 내 github 경력에 다소 절름발이 시작입니다. '중복으로 닫기'가 곧 제공됩니다!
thelatemail

1
@MattBannert 내가 제공 한 솔루션을 참조하십시오
Boern


30

사용할 필요는 select단지 사용하지 않는 [대신

data[,grepl("search_string", colnames(data))]

iris데이터 세트를 사용해 보겠습니다.

>iris[,grepl("Sepal", colnames(iris))]
  Sepal.Length Sepal.Width
1          5.1         3.5
2          4.9         3.0
3          4.7         3.2
4          4.6         3.1
5          5.0         3.6
6          5.4         3.9

6
@arumbay dplyr는 정말 대단한 것입니다-비록 당신이 그것을 할 수있을지라도 base, 표준 구문은 멋지고 / 읽을 수 있고 / 구성 할 수 없습니다- 내 대답을보십시오 .
Piotr Migdal

20

Piotr Migdals 응답을 기반으로 문자열 벡터에 대한 가능성을 가능하게하는 대체 솔루션을 제공하고 싶습니다.

myVectorOfStrings <- c("foo", "bar")
matchExpression <- paste(myVectorOfStrings, collapse = "|")
# [1] "foo|bar"
df %>% select(matches(matchExpression))

정규식 OR연산자 ( |) 사용

주의 : 열 이름의 일반 벡터가 실제로 있고 RegExpression의 힘이 필요하지 않은 경우이 답변 아래의 주석을 참조하십시오 (깨끗한 솔루션이므로).


5
알려진 열 이름의 벡터의 경우select(df, one_of(array_of_colnames))
AlexR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.