1. ホーム
  2. r

[解決済み] 2つのdata.frameを比較して、data.frame 1に存在し、data.frame 2に存在しない行を探す

2022-04-13 20:21:33

質問

以下の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が持っていない行を探したい。

このような操作を行うための組み込みの関数はありますか?

(p.s: 私はそのための解決策を書いたのですが、誰かがすでにもっと洗練されたコードを作っていないかどうか、単に興味があるだけです)

以下は私の解決策です。

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