2017-01-26 19 views
1

質問のタイトルがあまり明確でない場合はお詫びください。グループの反復とデータフレーム間の一致のカウント

Iは、2つのdata frame以下のように持っている:私はまた、各df1NAMEdf1NAMEためdf1$FOLLOWSの長さdf1$FOLLOWSdf2$FOLLOWScountマッチしたい

df1 
NAME FOLLOWS 
san big supa 
san EAU 
san simulate 
san spang 
glyn guido 
glyn claire 
glyn vincent 
glyn dan 
glyn peter 
glyn EAU 


df2 
FOLLOWS 
guido 
vincent 
EAU 
EUSC 
brian 
simulate 
peter 

。これらのデータフレームのために、私はこのような出力を期待しています:

df3 
NAME LENGTH_FOLLOWS COUNT_Match 
san  4   2 
glyn  6   4   

答えて

1

あなたがDF1に存在する値のみを保持しますどのDF2最初にDF1をマージすることができます。単にインスタンスを数えるだけです。

library(sqldf) 
sqldf('select NAME, count(NAME) as LENGTH_FOLLOWS , count(Actual_F) as COUNT_Match from (select t1.*, t2.FOLLOWS as Actual_F from df1 t1 left join df2 t2 on t1.FOLLOWS=t2.FOLLOWS) group by NAME') 

それともここで、ベースR

df1$index=match(df1$FOLLOWS, df2$FOLLOWS) 
aggregate(cbind(df1$FOLLOWS,df1$index), by = list(df1$NAME) , FUN = function(x) length(x[!is.na(x)])) 
+0

のおかげで非NA要素の論理ベクトルのsumを取得します。ベースRを使うと私にとってうまくいく。 – Santosh

1

を使用してdata.tableを使用してオプションです。最初のdata.frameを 'data.table'(setDT(df1))に変換し、onと 'df2'を結合してインデックス列( 'ind')を作成します。次に、「NAME」によってグループ化され、我々は行数(.N)と「IND」

library(data.table) 
setDT(df1)[df2, ind := 1, on = .(FOLLOWS)] 
df1[, .(LENGTH_FOLLOWS = .N, COUNT_MATCH = sum(!is.na(ind))), NAME] 
# NAME LENGTH_FOLLOWS COUNT_MATCH 
#1: san    4   2 
#2: glyn    6   4 
+1

代替案ありがとうございます。これも良いように見えます。 – Santosh

関連する問題