2016-08-11 2 views
0

키 값 (userid)이있는 user_role이라는 데이터 프레임이 있습니다. 나는이 사용자 ID 중 얼마나 많은 수가 단지 role이라는 범주 형 변수에 하나의 값만을 갖고 있는지보고 싶습니다. 여기 R 얼마나 많은 사용자가 하나의 값만 가지고 있는지 찾는 방법

몇 가지 샘플 데이터입니다 :

userid role 
ame1 programmer 
ame1 programmer 
ame1 analyst 
cal5 programmer 
cal5 programmer 
up2 sales 

하나 개의 역할이 있었다 그러나 더 이상의 역할 값을 가지고 있기 때문에 출력 데이터 프레임에 ame1하지 않아야하기 때문에 출력 데이터 세트에서 수 cal5 싶습니다 .

("select userid, role, count(*) from user_role group by userid, role having count(*) == 1") 

을 만 1 행 또는 역할 값으로 사용자를 얻을 :

나는 이런 식으로 뭔가를 시도했습니다.

("select userid, role, count(*) from user_role group by userid, role having count(*) > 1") 

나에게 하나 개의 역할을 가치있는 사람 그들은 여러 행

이 비록 내가 cal5과 UP2 모두 출력에 표시 갖고 싶어하지 않습니다. 이상적으로, 나는 2 개 이상의 행을 가진 사용자 만 포함하는 절을 가질 수 있기를 원합니다.

감사

+0

귀하의 마지막 코멘트에 동일한 모든 사람들은 나를 혼란. 원래'count (distinct role) '를 원했을 것이라고 생각했지만'up2'를 제외시킬 2 행 이상을 언급 했습니까? – sgeddes

+0

예, 사람이 출력 데이터 프레임에 포함시켜야 할 최소한의 행 수를 지정할 수 있다면 좋을 것입니다. 이게 도움이 되나요? 그러나 그들은 여전히 ​​최소한 두 행의 값에 대해서만 1 개의 값을 가져야합니다. – Jazzmine

+0

'table (unique (df1) $ userid)'는 사용자'userid' 당 고유 한'role' 수를 줄 것입니다. 또는'data.table'을 사용하여'library (data.table); setDT (df1) [, if (uniqueN (role) == 1 & .N> 1) .SD, by = userid]' –

답변

2

distinct에 사용 count은 하나의 역할 만 사용자에게 결과를 제한합니다. 그런 다음 여러 행을 확인 사용하는 count(*) > 1 :

select userid, min(role) as role 
from user_role 
group by userid 
having count(*) > 1 and count(distinct role) = 1 
+0

대답이 잘못되었습니다 - up2도 결과에 있어야합니다. 부품을 가지고있는 "count (*)> 1"을 제거하고 작동해야합니다. – Filip

+1

@Filip 이것은 OPs 요구 사항 중 하나였습니다. 실제로 –

+0

@DavidArenburg 다시 한번 읽으십시오. "role이라는 범주 형 변수에 대해 하나의 값을가집니다."up2는 하나의 역할을 가지고 있습니다. – Filip

1

당신은

library(dplyr) 

df %>% group_by(userid) %>% summarise(n_distinct(role)) 

출력이 같을 것이다 R에 dplyr 패키지를 사용할 수 있습니다

1 ame1    2 
2 cal5    1 
3 up2    1 

그리고 당신은 기반으로 선택할 수 있습니다 원하는 조건.

말은, 1.

df %>% group_by(userid) %>% summarise(n_distinct(role)==1) 
+1

'n_distinct' 허, 그거 꽤 깔끔하고 구체적입니다. – InfiniteFlashChess

+0

@InfiniteFlashChess'n_distinct'는 몇 년 동안 존재합니다. 그리고이 솔루션은 원하는 출력을 제공하지 않습니다. 덧글에 dplyr 및 data.table 솔루션을 게시했습니다. –

+0

@DavidArenburg 별도의 답변을 게시 할 수 있습니다. 나는 OP가 필요한 것을 가지고 있다고 생각합니다. – amrrs

관련 문제