web-dev-qa-db-ja.com

データフレームの補完を見つける(アンチ結合)

2つのデータフレーム(dfとdf1)があります。 df1はdfのサブセットです。 dfのdf1の補数であるデータフレームを取得したい、つまり、2番目で一致しない最初のデータセットの行を返します。たとえば、

データフレームdf:

heads
row1
row2
row3
row4
row5

データフレームdf1:

heads
row3
row5

目的の出力df2は次のとおりです。

heads
row1
row2
row4
27
oercim

anti_join from dplyr

library(dplyr)
anti_join(df, df1, by='heads')
27
akrun

_data.table_ sバイナリ結合を使用して、ある種のアンチ結合を行うこともできます

_library(data.table)
setkey(setDT(df), heads)[!df1]
#    heads
# 1:  row1
# 2:  row2
# 3:  row4
_

編集:開始data.tablev1.9.6 +on

_setDT(df)[!df1, on = "heads"]
_

EDIT2:開始data.tablev1.9.8 +fsetdiffが導入されました。これは基本的に上記のソリューション、x data.tableのすべての列名、たとえばx[!y, on = names(x)]allFALSEに設定されている場合(デフォルトの動作)、xの一意の行のみが返されます。各data.tableに1つの列しかない場合、以下は以前のソリューションと同等になります

_fsetdiff(df, df1, all = TRUE)
_
51
David Arenburg

%in%コマンドと!

df[!df$heads %in% df1$heads,]
20
C_Z_

ベースRとsetdiff関数を使用する別のオプション:

df2 <- data.frame(heads = setdiff(df$heads, df1$heads))

setdiffは、想像どおりに機能します。両方の引数をセットとして取り、最初の項目から2番目の項目をすべて削除します。

setdiffがより読みやすいtahtn %in%そして私がそれらを必要としないとき、追加のライブラリを必要としないことを好むが、あなたが使用する答えは主に個人的な好みの問題である。

6
Joe

dplyrにはsetdiff()もあります。

enter image description here

setdiff(bigFrame, smallFrame)は、最初のテーブルの追加レコードを取得します。

oPの例では、コードはsetdiff(df, df1)を読み取ります

dplyrには多くの優れた機能があります。簡単なガイドとして here。 を参照してください。

5
leerssej

plyrパッケージのnegate_match_dfのコードを操作して関数match_dfを作成する別のオプション。

library(plyr)
negate_match_df <- function (x, y, on = NULL) 
{
if (is.null(on)) {
    on <- intersect(names(x), names(y))
    message("Matching on: ", paste(on, collapse = ", "))
}
keys <- join.keys(x, y, on)
x[!keys$x %in% keys$y, , drop = FALSE]
}

データ

df <- read.table(text ="heads
row1
row2
row3
row4
row5",header=TRUE)

df1 <- read.table(text ="heads
row3
row5",header=TRUE)

出力

negate_match_df(df,df1)
2
user2100721

遅い答えですが、別のオプションとして、sqldfパッケージを使用して、正式なSQLアンチ結合を試すことができます。

library(sqldf)
sql <- "SELECT t1.heads
        FROM df t1 LEFT JOIN df1 t2
            ON t1.heads = t2.heads
        WHERE t2.heads IS NULL"
df2 <- sqldf(sql)

sqldfパッケージは、SQLロジックを使用して簡単に表現されるが、おそらくベースRまたは別のRパッケージを使用して簡単に表現されない問題に役立ちます。

1
Tim Biegeleisen