2015-02-02 4 views
1

두 개의 행렬 m1과 m2가 같은 구조를 가지고 있습니다. 이제 2 개의 새로운 행렬을 만들면됩니다.
1) 첫 번째 행렬 (Partenza)은 m1에서 모든 행을 갖는 것입니다. m2 2) 동일한 행 m2 내지 번째 (칼레 Arrivo) 다른R 행렬에서 다른 값을 가진 행을 추출합니다.

m1 
    row_num datoA  datoB 
    1   p   f 
    3   h   b 
    5   c   m 
    6   c   r 
    9   m   f 
    14   a   b 

m2 
    row_num datoA  datoB 
    1   p   f 
    3   h   b 
    5   c   g 
    6   a   r 
    9   m   f 
    14   x   j 

내 결과가 같아야

Partenza (taken from m1) 
    row_num datoA  datoB 
    5   c   m 
    6   c   r 
    14   a   b 

Arrivo (taken from m2) 
    row_num datoA  datoB 
    5   c   g 
    6   a   r 
    14   x   j 

제가

,691,363 시도 (210)
zzz <- setdiff(m1,m2) 
partenza<-m1[m1[,"ROW_NUM"] %in% zzz,] 
arrivo<- m1[m1[,"ROW_NUM"] %in% zzz,] 

그러나 ZZZ가 항상 곁에 비어 있음을 말해 작동하지 않습니다 (그리고 난 그렇지해야 확신합니다!)

답변

1

base R (필요 없음 패키지), 당신은 할 수 있습니다 :

diffrow<-sapply(1:nrow(m1),function(x) !all(m1[x,]==m2[x,])) 
partenza<-m1[diffrow,] 
arrivo<-m2[diffrow,] 

또 다른 옵션은 setdiff를 functi를 사용하여 패키지 dplyr에서에 : 두 경우 모두

library(dplyr) 
partenza<-setdiff(m1,m2) 
arrivo<-setdiff(m2,m1) 

, 당신은 얻을 것이다 :

> partenza 
# row_num datoA datoB 
#3  5  c  m 
#4  6  c  r 
#6  14  a  b 
> arrivo 
# row_num datoA datoB 
#3  5  c  g 
#4  6  a  r 
#6  14  x  j 

데이터 :

m1<-structure(list(row_num = c(1L, 3L, 5L, 6L, 9L, 14L), datoA = c("p", 
"h", "c", "c", "m", "a"), datoB = c("f", "b", "m", "r", "f", 
"b")), .Names = c("row_num", "datoA", "datoB"), class = "data.frame", row.names = c(NA, 
-6L)) 
m2<-structure(list(row_num = c(1L, 3L, 5L, 6L, 9L, 14L), datoA = c("p", 
"h", "c", "a", "m", "x"), datoB = c("f", "b", "g", "r", "f", 
"j")), .Names = c("row_num", "datoA", "datoB"), class = "data.frame", row.names = c(NA, 
-6L)) 
+1

이제 작동합니다. 나는 이전에 dplyr를 떼어 냈다. – akrun

+0

안타깝게도 다른 패키지를 사용할 수 없습니다. Igraph와 표준 R 라이브러리 –

+0

@AlexFort 만 사용할 수 있습니다. 그러면 내 'base' R 솔루션 (패키지 필요 없음)을 사용할 수 있습니다. – Cath

1

사용에게 anti_join 기능을 dplyr 패키지 :

package(dplyr) 

m1 <- data.frame(
    row_num = c(1,3,5,6,9,14), 
    datoA = c("p","h","c","c","m","a"), 
    datoB = c("f","b","m","r","f","b") 
) 

m2 <- data.frame(
    row_num = c(1,3,5,6,9,14), 
    datoA = c("p","h","c","a","m","x"), 
    datoB = c("f","b","g","r","f","j") 
) 

Partenza <- anti_join(m1,m2) %>% arrange(row_num) 
Arrivo <- anti_join(m2,m1) %>% arrange(row_num) 
+1

불행히도 나는 다른 패키지를 사용할 수 없습니다, I Igraph와 표준 R 라이브러리 만 사용할 수 있습니다. –