2017-03-05 12 views
1

IはR内の2つのデータフレームを有する:df11つのRデータフレームを別のRデータフレームの値でサブセット化する方法は?

Died.At <- c(22,40,72,41, ...) 
Writer.At <- c(16, 18, 36, 36) 
Name <- c("John Doe", "Edgar Poe", "Walt Whitman", "Jane Austen", ...) 
Gender <- c("MALE", "MALE", "MALE", "FEMALE", ...) 
Date.Of.Death <- c("2015-05-10", "1849-10-07", "1892-03-26","1817-07-18", ...) 
Pet <- c("cat", "dog", "cat", "cat") 
df1 = data.frame(Died.At, Writer.At, Name, Gender, Pet) 
print(df1) 
    Died.At Writer.At  Name   Gender Pet 
1  22  16  John Doe  MALE  cat 
2  40  18  Edgar Poe  MALE  dog 
3  72  36  Walt Whitman MALE  cat 
4  41  36  Jane Austen FEMALE cat 
..... 

ない各行Nameために独特である

第二データフレームdf2もある(すなわち、同じ著者を有する複数の行があります。)列Namedf1(例えば、Jane Austen)の両方の著者と全く新しい著者。このデータフレームもはるかに大きいです。

print(length(unique(df1$Name))) 
## output 1168 
print(length(unique(df2$Name))) 
## output 5572 

私は名前だけがdf1から名前があるdf2ように、そのサブセットしたいと思います。私の考え

はこれを行うことでした。

print(length(unique(subset_df2$Name))) 
## output 880 

私は期待していたよりも少ないです:

subset_df2 = df2[df2$Name == unique(df1$Name)] 

しかし、私はここに1168ユニー​​クな著者名があると期待されます。私のエラーはどこですか?

+0

"Name列の各値は一意ですが、df1では各行が一意ではありません(つまり、同じ著者が複数の行があります)。 df1の各行が一意でなく、いくつかの行が同じ作成者を持つ場合、df1が名前から構成されている場合、Nameはどのようにユニークですか。あなたのコードでもFirst.NameとSecond.Nameはありますが、df1には表示されません。 – Djork

+0

@ R.S。私は上記の---感謝を編集しました。 – ShanZhengYang

+0

'subset_df2 < - サブセット(df2、%df1 $ Nameの名前%)' – jdobres

答えて

3

match(df2$Name, df1$Name)またはdf2$Name %in% df1$Nameは、論理のベクトルにdf2 $ Nameの長さを、論理TRUEにdf2 $ Nameがdf1 $ Nameにあるベクトルを返します。これを使用して、df2を索引付けすることができます。

a = LETTERS[sample(1:10, size=15, replace=T)] 
b = c(unique(a), LETTERS[15:30]) 
# compare 
b == unique(a) 
b[b == unique(a)] 
# vs 
b %in% a 
b[b %in% a] 

も注意b %in% aa %in% bと等価ではないのでb[a %in% b]がもたらすであろう:

subset_df2 <- df2[df2$Name %in% df1$Name, ] 

はあなたのコードが動作しなかった理由については、この演習の出力を参照してください。

?matchを参照してください。間違った結果

さらに、データフレームのインデックスを作成するときは、行範囲と列範囲を指定する必要があります。

+0

上記のコードでは 'LETTERS'とは何ですか? – ShanZhengYang

+0

'subset_df2 = df2 [df2 $ Name%in%df1 $ Name]'と 'subset_df2 = df2 [df2 $ Name%%df1 $ Name] 'の間に違いはないようです。これは正しいです? – ShanZhengYang

+0

あなたのコメントに全く同じものを入力しましたが、 'match'と'%in% 'を意味するなら、それらは同じです。'?match'のヘルプファイルと '%in%' '%in%' < - function(x、table)match(x、table、nomatch = 0)> 0 'として定義されています。 'LETTERS'または' letters'はアルファベットのベクトルであるRの定数に組み込まれています。 '?letters'を参照してください。 – Djork

関連する問題