2016-08-11 1 views
0

Ich habe einen Datenframe namens user_role, wo es einen Schlüsselwert (userid) gibt. Ich möchte sehen, wie viele dieser Benutzer-IDs nur einen Wert für eine kategorische Variable namens role haben.R wie finde ich, wie viele Benutzer nur einen Wert haben

Hier einige Beispieldaten:

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

Ich würde cal5 wie in der Ausgabe-Dataset zu sein, weil es nur eine Rolle war aber ame1 sollte nicht in dem Ausgangsdatenrahmen, da es mehr als eine Rolle Wert hatte .

Ich habe so etwas wie dies versucht:

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

aber nur mit 1 Reihe oder Rollenwert Benutzer erhalten.

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

bekommt mir solche mit einer Rolle nicht nur Wert, obwohl sie in der Ausgabe sowohl cal5 und up2 zeigen mehrere Zeilen

Ich möchte haben müssen. Idealerweise hätte ich gerne eine Klausel, bei der ich nur Benutzer mit 2 oder mehr Zeilen einschließen würde.

Dank

+0

Ihre letzte Bemerkung gleich sind verwirrt mich. Ursprünglich dachte ich, du wolltest nur "count (distinct role)", aber dann nennst du 2 oder mehr Zeilen, die "up2" korrekt ausschließen würden? – sgeddes

+0

Ja, es wäre großartig, wenn ich eine Mindestzahl von Zeilen angeben könnte, die eine Person im Ausgabedatenrahmen enthalten müsste. Hilft das? Aber sie müssten immer noch nur einen Wert von mindestens zwei Zeilen haben. – Jazzmine

+0

'table (unique (df1) $ userid)' gibt Ihnen die Anzahl der eindeutigen 'role's pro Benutzer' userid'. Oder mit 'data.table' könnten Sie die Bedingungen' library (data.table); setDT (df1) [, if (uniqueN (role) == 1 & .N> 1) .SD, by = Benutzer-ID] ' –

Antwort

2

Verwenden count mit distinct mit einer einzigen Rolle, die Ergebnisse auf die Benutzer zu begrenzen. Dann gilt für mehrere Zeilen zu überprüfen, verwenden Sie count(*) > 1:

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

Es ist eine falsche Antwort - up2 sollte auch im Ergebnis sein. Entfernen Sie einfach "count (*)> 1" von Teil und sollte funktionieren – Filip

+1

@Filip das war eine der OP-Anforderungen tatsächlich –

+0

@DavidArenburg bitte noch einmal lesen. "habe einen Wert für eine kategorische Variable namens role".up2 habe eine Rolle – Filip

1

könnten Sie dplyr Paket in R verwenden

library(dplyr) 

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

Ausgabe würde wie folgt aussehen:

1 ame1    2 
2 cal5    1 
3 up2    1 

Und Sie können wählen, basierend auf die gewünschte Bedingung.

Sprich, alle diejenigen, die 1.

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

'n_distinct' huh, das ist ziemlich ordentlich und spezifisch – InfiniteFlashChess

+0

@InfiniteFlashChess' n_distinct' gibt es seit Jahren. Und diese Lösung gibt nicht die gewünschte Ausgabe. Ich habe in Kommentaren sowohl eine dplyr und data.table Lösung veröffentlicht, die –

+0

@DavidArenburg Sie können eine separate Antwort veröffentlichen. Ich denke OP hat was benötigt. – amrrs

Verwandte Themen