데이터 프레임 필터링


12

아직도 R의 기본 기능을 배우고 있습니다. 하위 집합 함수는 여러 조건이 있거나없는 단일 열을 기반으로 조건을 필터링하는 것 같습니다.

데이터 프레임에서 데이터를 쉽게 필터링하려면 어떻게해야합니까?

  1. 여러 조건이 제공 될 때

  2. 사용 가능한 열에 조건을 적용해야하는 경우

예 : 주어진 데이터 프레임

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

이 데이터 프레임을 필터링하여 D1 ~ D4 중 하나가 'E'인 이름 만 있으면되도록해야한다고 말하십시오.

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

D1이 큰 열 목록이 될 수 있다고 가정하십시오.이 필터를 수행하는 데 권장되는 방법은 무엇입니까? 감사합니다

답변:


26

서브 세트 함수 에서 여러 필터를 결합 하려면 논리 연산자를 사용하십시오.

 subset(data, D1 == "E" | D2 == "E")

D1 열 또는 D2 열에 "E"값이있는 행을 선택합니다. 사용 가능한 논리 연산자에 대한 도움말 페이지를보십시오.

 > ?"|"

두 번째 질문은 행을 필터링하는 것입니다. 이것은 다음과 같은 방법으로 달성 할 수 있습니다

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

적용 할 첫 번째 인수 는 필터링해야하는 열을 가정합니다. 두 번째 인수는 1이며, 데이터 행을 반복한다는 의미입니다. 세 번째 인수는 이름이없는 한 줄 함수로 , "E"가 행에 있으면 TRUE 를 반환 하고 "E"가 없으면 FALSE를 반환합니다.

apply 함수의 결과는 데이터의 행 수와 길이가 같은 논리 형 벡터 sel 입니다. 그런 다음이 벡터를 사용하여 필요한 행을 선택합니다.

최신 정보

grep을 사용하여 동일한 작업을 수행 할 수 있습니다.

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

기본 인수가 있는 R grep 에서 제공된 벡터에서 일치하는 패턴을 가진 요소 수를 반환합니다.


2
또 다른 유용한 기능은 any입니다. 예를 들어 벡터의 적어도 하나의 요소가 있는지 확인하려면 = 10( any(v==10))를 쓸 수 있습니다.
nico jan

그래 @nico 그러나 %의 V에서 10 % 와 9 자 및 변형이 있는 10 :)을. 숫자 형 벡터의 경우 등식을 사용하는 것이 좋습니다. R은 똑똑하고 데이터가 실수와 혼합 된 정수인 경우 데이터 세트에 10이 있음을 올바르게 인식합니다.
mpiktas

정규 표현식의 경우는 어떻습니까? 정확히 일치하는 작업을 원하지 않는다고 가정합니까? 그들은 다른 언어 에서처럼 ~ =에 가까운 것을 가지고 있습니까? R
에서이

참조 @Biorelated grepagrepPOSIX 1003.2 또는 펄 호환 정규 표현식에, 및 관련 문서를.
chl

@Biorelated, grep 예제로 답변을 업데이트했습니다.
mpiktas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.