2016-08-11 55 views
0

我有一個名爲user_role的數據框,其中有一個鍵值(用戶ID)。我想看看有多少這些用戶標識只有一個用於稱爲角色的分類變量的值。R如何找到有多少用戶只有一個值

下面是一些樣本數據:

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

我想cal5是在輸出數據集中,因爲世界上只有一個角色,但ame1不應該在輸出數據幀,因爲它有一個以上的角色值。

我已經試過這樣的事情:

("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輸出顯示。理想情況下,我希望能夠有一個條款,我只包括具有兩行或更多行的用戶。

感謝

+0

你最後的評論讓我困惑。本來我以爲你只是想'count(獨特的角色)',但是你提到2行或更多的行,這將排除'up2'正確? – 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

使用countdistinct的結果限制爲僅具有單一角色的用戶。然後檢查多個行,請使用count(*) > 1

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

這是錯誤的答案 - up2也應該在結果中。只刪除「計數(*)> 1」的部分,應該工作 – Filip

+1

@Filip這是OP的要求之一實際 –

+0

@DavidArenburg請再閱讀一次。 「對於一個名爲角色的分類變量有一個值」。up2有一個角色 – Filip

1

你可以使用dplyr包中的R

library(dplyr) 

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

輸出應該是這樣的:

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

相關問題