2016-08-11 57 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

相关问题