2016-06-24 4 views
1

で行方不明見つけること、data.frame 1の行は次のように私は2つのデータフレームを持っている他の

a1 <- data.frame(a = 1:5, b=letters[1:5], c = 1:5) 
a2 <- data.frame(a = 1:3, b=letters[1:3], d = 1:3) 

を別の列を持つ2 data.framesの比較私はとA2に存在しないA1の行を見つけたいです最初の2つの列(a、b)だけを基準にします。私の理想的な出力をする必要があり、私は次のことを試してみました

a b c match 
1 1 a 1 yes 
2 2 b 2 yes 
3 3 c 3 yes 
4 4 d 4 no 
5 5 e 5 no 

output <- sqldf('SELECT * FROM a1 EXCEPT SELECT * FROM a2') 

が、この1は、データフレームとも名前が同じで、両方に同じ列があるときにのみ機能します。しかし、私は(a、b)の列で一致するものだけを見つけて、a1の出力にyes/noを指定したいと考えています。

誰かがこれを見つけるのを助けることができますか?

答えて

4

我々はmergeを行うとNA

c("no", "yes")[(!is.na(merge(a1, a2, by = c("a", "b"), all.x=TRUE)$d))+1L] 
#[1] "yes" "yes" "yes" "no" "no" 

それともmerge INGなしを見つけることができ、私たちは一緒に列をpaste%in%との比較を行うと、「はい/いいえ」

に論理的に変換することができます
c('no', 'yes')[(paste(a1$a, a1$b) %in% paste(a2$a, a2$b))+1] 
#[1] "yes" "yes" "yes" "no" "no" 

それともdplyr

0を使用して
library(dplyr) 
left_join(a1, a2, by = c("a", "b")) %>% 
      mutate(d = c("no", "yes")[(!is.na(d))+1]) 
# a b c d 
# 1 1 a 1 yes 
# 2 2 b 2 yes 
# 3 3 c 3 yes 
# 4 4 d 4 no 
# 5 5 e 5 no 
+0

。私はここで疑いが1つあります。a2のデータフレーム(a、b)の列名が(q、w)のようなものであれば、次のように指定できます。 c( "no"、 "yes")[(!is.na (merge(a1、a2、by = c( "a" = "q"、 "b" = "w")、all.x = TRUE)$ d))+ 1L] – haimen

+0

@haimen 'left_join'では、あなたはその構文を行うことができますが、 'merge'では' by.x'と 'by.y'となります – akrun

2

ライブラリprodlimの関数row.matchを使用してください。これは、(最初​​の)一致数のベクトルとそれ以外の場合はNAを返します。 yes/noを割り当てるにはifelseと組み合わせてください。

library(prodlim) 
a1$match <- ifelse(is.na(row.match(a1, a2)), "no", "yes")  

# a b c match 
#1 1 a 1 yes 
#2 2 b 2 yes 
#3 3 c 3 yes 
#4 4 d 4 no 
#5 5 e 5 no 
+0

プラス1つです。これは 'paste/match'のラッパーではありません – akrun

+0

ありがとうございました。マニュアルの記述に基づいて、私はそれがそうであると言います。 – milan

1

別のオプションがあります。 plyrパッケージのmatch_df機能を使用することができます。このためおかげで@akun

library(plyr) 
a1$match <- ifelse(row.names(a1) %in% row.names(match_df(a1,a2)),"yes","no") 

出力

a b c match 
1 1 a 1 yes 
2 2 b 2 yes 
3 3 c 3 yes 
4 4 d 4 no 
5 5 e 5 no 
関連する問題