2つのデータフレーム(dfとdf1)があります。 df1はdfのサブセットです。 dfのdf1の補数であるデータフレームを取得したい、つまり、2番目で一致しない最初のデータセットの行を返します。たとえば、
データフレームdf:
heads
row1
row2
row3
row4
row5
データフレームdf1:
heads
row3
row5
目的の出力df2は次のとおりです。
heads
row1
row2
row4
anti_join
from dplyr
library(dplyr)
anti_join(df, df1, by='heads')
_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)]
。 all
がFALSE
に設定されている場合(デフォルトの動作)、x
の一意の行のみが返されます。各data.tableに1つの列しかない場合、以下は以前のソリューションと同等になります
_fsetdiff(df, df1, all = TRUE)
_
%in%
コマンドと!
df[!df$heads %in% df1$heads,]
ベースRとsetdiff
関数を使用する別のオプション:
df2 <- data.frame(heads = setdiff(df$heads, df1$heads))
setdiff
は、想像どおりに機能します。両方の引数をセットとして取り、最初の項目から2番目の項目をすべて削除します。
setdiff
がより読みやすいtahtn %in%
そして私がそれらを必要としないとき、追加のライブラリを必要としないことを好むが、あなたが使用する答えは主に個人的な好みの問題である。
dplyrにはsetdiff()
もあります。
setdiff(bigFrame, smallFrame)
は、最初のテーブルの追加レコードを取得します。
oPの例では、コードはsetdiff(df, df1)
を読み取ります
dplyrには多くの優れた機能があります。簡単なガイドとして here。 を参照してください。
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)
遅い答えですが、別のオプションとして、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パッケージを使用して簡単に表現されない問題に役立ちます。