2017-01-26 3 views
1

질문의 제목이 분명하지 않은 경우 사과하십시오.그룹 반복 및 데이터 프레임 간의 일치 계산

나는 두 data frame 아래와 같이있다 : 나는 또한 각 df1에서 NAMEdf1의 각 NAME에 대한 df1$FOLLOWS의 길이 df1$FOLLOWSdf2$FOLLOWS 사이 count 경기 싶습니다

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)와 '공업'

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