다음과 같은 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 명령도 있습니다
답변
당신이 사용할 수있는 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 출력을 생성합니다.