[r] data.frame 2에 존재하지 않는 data.frame 1의 행을 찾으려면 두 개의 data.frame을 비교하십시오.

다음과 같은 2 개의 data.frame이 있습니다.

a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = 1:3, b=letters[1:3])

a1에 a2가없는 행을 찾고 싶습니다.

이 유형의 작업에 내장 된 기능이 있습니까?

(ps : 해결책을 작성했습니다. 누군가 이미 더 만들어진 코드를 만들면 궁금합니다.)

내 해결책은 다음과 같습니다.

a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = 1:3, b=letters[1:3])

rows.in.a1.that.are.not.in.a2  <- function(a1,a2)
{
    a1.vec <- apply(a1, 1, paste, collapse = "")
    a2.vec <- apply(a2, 1, paste, collapse = "")
    a1.without.a2.rows <- a1[!a1.vec %in% a2.vec,]
    return(a1.without.a2.rows)
}
rows.in.a1.that.are.not.in.a2(a1,a2)



답변

이것은 귀하의 질문에 직접 대답하지는 않지만 공통적 인 요소를 제공합니다. 이것은 Paul Murrell의 패키지를 사용하여 수행 할 수 있습니다 compare.

library(compare)
a1 <- data.frame(a = 1:5, b = letters[1:5])
a2 <- data.frame(a = 1:3, b = letters[1:3])
comparison <- compare(a1,a2,allowAll=TRUE)
comparison$tM
#  a b
#1 1 a
#2 2 b
#3 3 c

이 함수 compare는 어떤 종류의 비교가 허용되는지 (예 : 각 벡터의 요소 순서 변경, 변수 순서 및 이름 변경, 변수 단축, 문자열 대 / 소문자 변경) 측면에서 많은 유연성을 제공합니다. 이것에서, 당신은 어느 하나에서 누락 된 것을 알아낼 수 있어야합니다. 예를 들어 (매우 우아하지는 않습니다) :

difference <-
   data.frame(lapply(1:ncol(a1),function(i)setdiff(a1[,i],comparison$tM[,i])))
colnames(difference) <- colnames(a1)
difference
#  a b
#1 4 d
#2 5 e


답변

SQLDF 좋은 해결책을 제공합니다

a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = 1:3, b=letters[1:3])

require(sqldf)

a1NotIna2 <- sqldf('SELECT * FROM a1 EXCEPT SELECT * FROM a2')

그리고 두 데이터 프레임에있는 행 :

a1Ina2 <- sqldf('SELECT * FROM a1 INTERSECT SELECT * FROM a2')

의 새 버전 dplyr에는 anti_join정확히 이러한 종류의 비교를위한 기능 이 있습니다.

require(dplyr)
anti_join(a1,a2)

그리고 그 semi_join안에 a1있는 행을 필터링하기 위해a2

semi_join(a1,a2)


답변

에서 dplyr :

setdiff(a1,a2)

기본적으로 setdiff(bigFrame, smallFrame)첫 번째 테이블에서 추가 레코드를 얻습니다.

SQLverse에서는 이것을

결합 벤 다이어그램을 제외한 왼쪽

모든 조인 옵션 및 주제 설정에 대한 자세한 설명을 위해 지금까지 내가 본 최고의 요약 중 하나입니다. http://www.vertabelo.com/blog/technical-articles/sql-joins

그러나이 질문으로 돌아 가면 setdiff()OP의 데이터를 사용할 때 의 코드 결과는 다음과 같습니다.

> a1
  a b
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e

> a2
  a b
1 1 a
2 2 b
3 3 c

> setdiff(a1,a2)
  a b
1 4 d
2 5 e

또는 anti_join(a1,a2)동일한 결과를 얻을 수도 있습니다.
자세한 정보 : https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf


답변

이 특정 목적에는 확실히 효과적이지 않지만 이러한 상황에서 자주하는 일은 각 data.frame에 지표 변수를 삽입 한 다음 병합하는 것입니다.

a1$included_a1 <- TRUE
a2$included_a2 <- TRUE
res <- merge(a1, a2, all=TRUE)

included_a1에서 누락 된 값은 a1에서 누락 된 행을 나타냅니다. a2와 유사합니다.

솔루션의 한 가지 문제점은 열 순서가 일치해야한다는 것입니다. 또 다른 문제는 실제로 행이 다르면 행이 동일하게 코딩되는 상황을 쉽게 상상할 수 있다는 것입니다. 병합을 사용하면 좋은 솔루션에 필요한 모든 오류 검사를 무료로 얻을 수 있다는 이점이 있습니다.


답변

나는 같은 문제가 있었기 때문에 패키지 ( https://github.com/alexsanjoseph/compareDF )를 썼습니다 .

  > df1 <- data.frame(a = 1:5, b=letters[1:5], row = 1:5)
  > df2 <- data.frame(a = 1:3, b=letters[1:3], row = 1:3)
  > df_compare = compare_df(df1, df2, "row")

  > df_compare$comparison_df
    row chng_type a b
  1   4         + 4 d
  2   5         + 5 e

더 복잡한 예 :

library(compareDF)
df1 = data.frame(id1 = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710",
                         "Hornet 4 Drive", "Duster 360", "Merc 240D"),
                 id2 = c("Maz", "Maz", "Dat", "Hor", "Dus", "Mer"),
                 hp = c(110, 110, 181, 110, 245, 62),
                 cyl = c(6, 6, 4, 6, 8, 4),
                 qsec = c(16.46, 17.02, 33.00, 19.44, 15.84, 20.00))

df2 = data.frame(id1 = c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710",
                         "Hornet 4 Drive", " Hornet Sportabout", "Valiant"),
                 id2 = c("Maz", "Maz", "Dat", "Hor", "Dus", "Val"),
                 hp = c(110, 110, 93, 110, 175, 105),
                 cyl = c(6, 6, 4, 6, 8, 6),
                 qsec = c(16.46, 17.02, 18.61, 19.44, 17.02, 20.22))

> df_compare$comparison_df
    grp chng_type                id1 id2  hp cyl  qsec
  1   1         -  Hornet Sportabout Dus 175   8 17.02
  2   2         +         Datsun 710 Dat 181   4 33.00
  3   2         -         Datsun 710 Dat  93   4 18.61
  4   3         +         Duster 360 Dus 245   8 15.84
  5   7         +          Merc 240D Mer  62   4 20.00
  6   8         -            Valiant Val 105   6 20.22

패키지에는 빠른 검사를위한 html_output 명령도 있습니다

df_compare $ html_output
여기에 이미지 설명을 입력하십시오


답변

당신이 사용할 수있는 daff패키지 (감쌈 daff.js도서관 은 Using V8패키지 ) :

library(daff)

diff_data(data_ref = a2,
          data = a1)

다음과 같은 차이점 개체를 생성합니다.

Daff Comparison: ‘a2’ vs. ‘a1’
  First 6 and last 6 patch lines:
   @@   a   b
1 ... ... ...
2       3   c
3 +++   4   d
4 +++   5   e
5 ... ... ...
6 ... ... ...
7       3   c
8 +++   4   d
9 +++   5   e

diff 형식은 표에 대한 Coopy 형광펜 diff 형식으로 설명되어 있으며 매우 자명해야합니다. +++첫 번째 열에 있는 줄 @@은에 새롭고 a1존재하지 않는 줄입니다 a2.

차이점 개체는 다음을 사용하여 patch_data()문서 목적으로 차이점을 저장 write_diff()하거나 다음을 사용하여 차이점render_diff()시각화하는 데 사용할 수 있습니다 .

render_diff(
    diff_data(data_ref = a2,
              data = a1)
)

깔끔한 HTML 출력을 생성합니다.

여기에 이미지 설명을 입력하십시오


답변

diffobj패키지 사용 :

library(diffobj)

diffPrint(a1, a2)
diffObj(a1, a2)

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오