열의 부분 문자열 일치를 기반으로 데이터 프레임 행 선택


96

열에있는 문자열의 부분 일치를 기반으로 데이터 프레임에서 행을 선택하고 싶습니다. 예를 들어 열 'x'에 문자열 "hsa"가 포함되어 있습니다. 사용 sqldf- 경우에 그것이 있었다 like구문 - 내가 좋아하는 일을 할 것을 :

select * from <> where x like 'hsa'.

불행히도 sqldf해당 구문을 지원하지 않습니다.

또는 유사하게 :

selectedRows <- df[ , df$x %like% "hsa-"]

물론 작동하지 않습니다.

누군가 나를 도와 줄 수 있습니까?


6
당신은 바람직하게는 같은 것을 사용하여, 데이터의 몇 줄을 게시 할 수 있습니다 dput(head(conservedData)).
A5C1D2H2I1M1N2O1R2T1

답변:


147

%like%현재 접근 방식에서 기능을 언급 한 것을 알았습니다 . 그것이 %like%"data.table" 의 참조인지는 모르겠지만, 그렇다면 다음과 같이 확실히 사용할 수 있습니다.

객체가 a 일 필요는 data.table없지만 data.frames 및 data.tables에 대한 부분 집합 화 방식 이 동일하지 않음 을 기억하십시오 .

library(data.table)
mtcars[rownames(mtcars) %like% "Merc", ]
iris[iris$Species %like% "osa", ]

그것이 당신이 가진 것이라면 아마도 데이터 부분 집합 화를 위해 행과 열 위치를 혼합했을 것입니다.


패키지를로드하지 않으려면을 사용하여 grep()일치하는 문자열을 검색 할 수 있습니다 . 다음 mtcars은 행 이름에 "Merc"가 포함 된 모든 행과 일치하는 데이터 세트 의 예입니다 .

mtcars[grep("Merc", rownames(mtcars)), ]
             mpg cyl  disp  hp drat   wt qsec vs am gear carb
# Merc 240D   24.4   4 146.7  62 3.69 3.19 20.0  1  0    4    2
# Merc 230    22.8   4 140.8  95 3.92 3.15 22.9  1  0    4    2
# Merc 280    19.2   6 167.6 123 3.92 3.44 18.3  1  0    4    4
# Merc 280C   17.8   6 167.6 123 3.92 3.44 18.9  1  0    4    4
# Merc 450SE  16.4   8 275.8 180 3.07 4.07 17.4  0  0    3    3
# Merc 450SL  17.3   8 275.8 180 3.07 3.73 17.6  0  0    3    3
# Merc 450SLC 15.2   8 275.8 180 3.07 3.78 18.0  0  0    3    3

그리고 또 다른 예 iris는 문자열을 검색 하는 데이터 세트를 사용하는 것입니다 osa.

irisSubset <- iris[grep("osa", iris$Species), ]
head(irisSubset)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

문제에 대해 시도해보십시오.

selectedRows <- conservedData[grep("hsa-", conservedData$miRNA), ]

+1 : 또한 grep정규식 을 지원하므로 ^hsa-대신 grep을 원할 수 있습니다 .
nico

3
@nico : 사실, greped 명령 g / re / p (글로벌 / 정규식 / 인쇄)에서 왔으며 정규식의 마스터에게만 진정한 힘을 보여줍니다 .-) : en.wikipedia.org/ wiki / Grep
Stephan Kolassa 2010 년

1
%의 같은 % 제안은 위대하다! 나는 그것을 당신의 대답 위에 두는 것이 좋습니다.
때로 믿을 수 Cambre

@ArenCambre, 완료되었습니다. 아마도 그것은 내가 연말 전에 새 모자를 얻을 수 있도록 11 표를 더 얻는 데 도움이 될 것입니다 :-)
A5C1D2H2I1M1N2O1R2T1

@ A5C1D2H2I1M1N2O1R2T1 좋은 대답입니다! % like %를 사용하여 함께 발생하는 두 문자열을 검색하는 방법이 있습니까 ( "peter piper"로 데이터 프레임의 행에서 발생하는 "pet"및 "pip"에서와 같이)?
nigus21

60

문자열에서 패턴의 유무를 감지 str_detect()하는 stringr 패키지를 사용해보십시오 .

여기에 또한 통합하는 접근 방법이다 %>%파이프 filter()로부터 dplyr의 패키지 :

library(stringr)
library(dplyr)

CO2 %>%
  filter(str_detect(Treatment, "non"))

   Plant        Type  Treatment conc uptake
1    Qn1      Quebec nonchilled   95   16.0
2    Qn1      Quebec nonchilled  175   30.4
3    Qn1      Quebec nonchilled  250   34.8
4    Qn1      Quebec nonchilled  350   37.2
5    Qn1      Quebec nonchilled  500   35.3
...

이렇게하면 처리 변수에 하위 문자열 "non"이 포함 된 행에 대한 샘플 CO2 데이터 세트 (R과 함께 제공됨)가 필터링됩니다. str_detect고정 된 일치를 찾거나 정규식을 사용 하는지 여부를 조정할 수 있습니다 . stringr 패키지에 대한 문서를 참조하십시오.


당신은 또한 사용할 수 있습니다 trc_detect의 이 같은 기능myDataFrame[str_detect(myDataFrame$key, myKeyPattern),]
Bemipefe

20

LIKE sqlite에서 작동해야합니다.

require(sqldf)
df <- data.frame(name = c('bob','robert','peter'),id=c(1,2,3))
sqldf("select * from df where name LIKE '%er%'")
    name id
1 robert  2
2  peter  3

SQLDF는 나열에 가장 적합합니다. 그러나 행을 삭제할 수는 없습니다.
Suat Atan PhD

1
왜 R 패키지는로드되고 require()여기에
rgalbo

표준 R 라이브러리가 아니기 때문에 수동으로 설치 한 다음 require함수를 사용하여로드해야합니다 .
bartektartanus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.