2015-01-17 5 views
6

R에 여러 개의 ID와 값을 가진 data.table이 있습니다. ID의 각 조합에 대해 여러 행이 있습니다. 이 행 중 하나에 'value'열에 NA가 포함 된 경우이 ID 조합으로 모든 행을 제거하고 싶습니다. 예를 들어, 아래 표에서 id1 == 2id2 == 1 인 모든 행을 제거하고 싶습니다.여러 열의 값을 기준으로 R에서 data.table의 행을 제거합니다.

내가 단 하나의 신원이 있다면 나는 dat[!(id1 %in% dat[is.na(value),id1])]을 할 것입니다. 이 예에서는 i1 == 2 인 모든 행을 제거합니다. 그러나 여러 열을 포함 할 수 없었습니다. 당신이 값 중 하나가 NA의 경우 id1id2의 조합에 따라 확인하고 그 전체 조합을 제거하려면

dat <- data.table(id1 = c(1,1,2,2,2,2), 
        id2 = c(1,2,1,2,3,1), 
        value = c(5,3,NA,6,7,3)) 
+1

시도 'DAT [! (ID1의 == 2 ID2 == 1)]'또는'는 setkey (DAT, ID1, ID2)! J (2, 1)]' – akrun

+0

위의 간단한 예제에서 이것이 작동한다는 것을 알고 있습니다. 그러나이 질문은 NA가있는 많은 수의 행이있을 수 있으므로 좀 더 일반적입니다. – lilaf

+1

그가'dat [, if (모두 (! is.na (value))) .SD,. (id1, id2)] '를 찾고 있다고 생각합니다. –

답변

4

, 당신은 그룹 당 if 문을 삽입 할 수 있습니다 만 (.SD 사용) 결과를 검색 해당 문이 TRUE을 반환하면

dat[, if(!anyNA(value)) .SD, by = .(id1, id2)] 
# id1 id2 value 
# 1: 1 1  5 
# 2: 1 2  3 
# 3: 2 2  6 
# 4: 2 3  7 

아니면 마찬가지로

dat[, if(all(!is.na(value))) .SD, by = .(id1, id2)] 
+1

다시 한번 감사드립니다! – lilaf

+0

'dat'을 모두'.SD'로 분할하여 스택하는 것은 비용이 많이들 것입니다. 대안 (아마 일반적으로 빠를 것인가?) 접근법은'dat [dat [,! any (is.na (value)), by = "id1, id2"] $ V1]' – Frank

+1

@Frank을 유지하기위한 행을 선택하는 것입니다. 작동하지 않습니다. 테스트 해 봤어? –

관련 문제