1 つのデータフレームから、2 番目のデータフレームに存在しない行を選択する 質問する

1 つのデータフレームから、2 番目のデータフレームに存在しない行を選択する 質問する

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 にはない行を見つけたいです。

このタイプの操作用の組み込み関数はありますか?

(追記: 私はそれに対する解決策を書きました。誰かがすでにもっと巧妙なコードを作っているかどうか、単純に知りたいのです)

これが私の解決策です:

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)

ベストアンサー1

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の行をフィルタリングするには、a1a2

semi_join(a1,a2)

おすすめ記事