2016-06-01 3 views
0

는 :비교 벡터 다음 예에서

DT <- data.table(A1=c(1,2),A2=c(2,3),B1=c(1,2),B2=c(3,4),B3=c(2,5)) 

I 열 A1 및 A2의 값이 모두 B1 중, B2 또는 B3의 발생 여부를 각각의 행에 대해 검사 할 .

내가 할 경우

DT[,BOTH_PRESENT:=!(F %in% (c(A1,A2) %in% c(B1,B2,B3)))] 

이 수율 :

A1 A2 B1 B2 B3 BOTH_PRESENT 
1: 1 2 1 3 2   TRUE 
2: 2 3 2 4 5   TRUE 

내가 2 행 1 행에 대해 참과 거짓 기대 동안

.

# Row 1 
!(F %in% (c(1,2) %in% c(1,3,2))) 
# Row 2 
!(F %in% (c(2,3) %in% c(2,4,5))) 

코드를 어떻게 변경해야합니까?

내 실제 데이터 세트가 열의 관점에서 훨씬 더 커서 (A1 == B1 | A1 == B2 | A1 == B3) & (A2 == B1 | A2 == B2 | A2 == B3)과 같은 표현을 만드는 것이 좋은 해결책이 될 수 없기 때문에.

+0

왜 downvote? 그렇게한다면 의견을 보내주십시오. –

+3

결국 솔루션은 실제로 매우 효율적이라고 생각합니다. 많은 열이있는 경우에만 프로그래밍 방식으로 식을 만들어야합니다. – Roland

+0

좋아, 시도해 주셔서 감사합니다 –

답변

2

우리는 data.table 행, unlist 'A', 칼럼의 순서에 의해 그룹은 그 요소 %in%unlist ED 'B'열이다 all 여부를 확인할 수있다.

DT[, BOTH_PRESENT := all(unlist(.SD[, 1:2, with = FALSE]) %in% 
     unlist(.SD[, 3:5, with = FALSE])), by = 1:nrow(DT)] 

또는 @Roland가 언급 한 바와 같이

,

DT[,BOTH_PRESENT:= all(c(A1, A2) %in% c(B1,B2,B3)), by = seq_len(nrow(DT))] 
+3

또는 DT =, BOTH_PRESENT : = all (c (A1, A2) % c (B1, B2, B3)), by = seq_len))]'. Bot은 행을 반복하는 루프이므로 속도가 느릴 수 있습니다. – Roland

+0

감사합니다. 실제로 집계 측정 값을 계산하기 위해 A1 및 A2로 그룹화하는 동안이 검사를 수행해야하지만 코드를 다시 작성하여 코드를 다시 작성할 수 있습니다. –

+0

굉장! 고마워요, 매력처럼 작동합니다. 나는 주석에서 @Roland의 솔루션을 더 선호한다. –