R을 배우고 데이터 프레임을 필터링하기 위해 Regex를 사용하여 하위 집합 () 및 grepl ()을 실험하고 있습니다. 재생할 매우 작은 데이터 프레임을 만들었습니다.
x y z w
1 10 a k
2 12 b l
3 14 c m
4 16 d n
5 18 e o
내 코드는 다음과 같습니다.
subset(df14, grepl('^c | [l - n]', c(df14$z , df14$w) ), grepl('[yz]', colnames(df14)) )
내 생각에 두 번째 인수는 grepl ()에서 찾은 행의 인덱스를 반환하여 이름이 'z'또는 'w'인 열의 패턴과 일치해야합니다. 그러나 이것은 일어나는 일이 아닙니다 (열 y 및 z가있는 빈 데이터 프레임을 반환 함).
열 'w'에는 [ln] 정규식 패턴에 지정된 문자 l, m, n과 z 및 w 열이 포함되어 있으므로 행 2,3,4를 반환 할 것으로 예상합니다. 이러한 이름은 다음의 정규식 [yz]와 일치하기 때문입니다. 서브 세트 ()의 세 번째 인수.
(나는 그것이 열의 내용보다는 열의 이름에서 일치하는 것을 찾고 있다고 생각합니다.
당연히 결과 자체에는 관심이 없습니다. 기능이 어떻게 작동하는지 이해하기위한 실험입니다. 그래서 제가 찾고있는 것은 대체 솔루션이 아닌 특정 코드를 수정하는 설명과 방법입니다.
귀하의 조언을 주시면 감사하겠습니다.
다양한 문제가 있습니다.
한 가지 문제는 패턴에 추가 공간이 있다는 것입니다. 그것들을 삭제하거나 free-spacing modifier (?x)
를 perl = TRUE
. 어느 쪽이든 문자 클래스에서 공백을 제거해야합니다. [l-n]
"m"과 일치 [l - n]
하고 (?x)
. 자유 간격 수정 자 및 문자 클래스 내부 및 외부에 미치는 영향에 대한 자세한 내용은 여기에서 확인할 수 있습니다 .
또 다른 문제는 첫 번째 grepl
에서 길이가 10 인 벡터 (문자형 벡터? 예에서 알 수 없음) 내에서 검색한다는 것입니다. 6 번째 위치의 TRUE가 5 행 data.frame에 대해 무엇을 의미합니까? 5 행 데이터 프레임의 6 행을 반환하는 것은 이치에 맞지 않습니다. 대신 "w" |
열 또는 ( ) 열 "z"에 대해 패턴이 있는지 확인할 수 있습니다 . 열의 연결이 아니라 각 열을 살펴보십시오.
두 번째 문제는 grepl
"w"가에 대한 일치가 아닙니다 [yz]
. 이름에 "w"또는 "z"가 포함 된 열을 선택하려는 경우 한 가지 방법은 다음과 [wz]
같습니다.
^
모든 문자열에 단일 문자가 포함되어 있으므로 앵커 가 필요하지 않지만 어쨌든 그대로 두겠습니다.
subset(df14,
subset = grepl('^c|[l-n]', df14$z) |
grepl('^c|[l-n]', df14$w),
select = grepl('[wz]', colnames(df14)))
# z w
#2 b l
#3 c m
#4 d n
또는 free-spacing 모드 수정 자와 두 번째에 대해 다른 패턴 ( [wz]
vs w|z
)을 사용합니다 grepl
.
subset(df14,
subset = grepl('(?x)^c | [l-n]', df14$z, perl = TRUE) |
grepl('(?x)^c | [l-n]', df14$w, perl = TRUE),
select = grepl('w|z', colnames(df14)))
# z w
#2 b l
#3 c m
#4 d n
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다