2016-06-08 5 views
1

Ich habe einen Datensatz ähnlich wie unter:Wie werden nur die Zeilen mit mehreren verschiedenen Werten in einer anderen Spalte in R untergeordnet?

zz <- "Session Rater  
1   A   X   
2   A   X  
3   A   X 
4   B   Y 
5   B   Y  
6   B   Z 
7   B   Z   
8   C   X 
9   C   Y  
10   C   Z" 

Data <- read.table(text=zz, header = TRUE) 

Ich möchte nur die Session-Zeilen der Teilmenge, für die die Sitzung mehrere Rater hat, auch wenn diese Daten in einer anderen Spalte gespeichert wird. Daher würde ich am Ende mit einem Datensatz wie die wie folgt aussieht:

zz2 <- "Session Rater  
1   B   Y 
2   B   Y 
3   B   Z 
4   B   Z 
5   C   X 
6   C   Y 
7   C   Z" 

Data2 <- read.table(text=zz2, header = TRUE) 

Wo Session A Zeilen aus dem Datensatz entfernt wurden, weil Session A nur eine rater hatte, „X“, sondern Sessions B und C (und alle ihre Reihen) wurden beibehalten, weil sie mehr als einen Bewerter hatten (Y & Z für Sitzung B und X, Y, & Z für Sitzung C).

Ich habe mit dplyr herum gespielt, aber mit keinem Erfolg. Danke vielmals.

+1

im Wesentlichen der gegenüber von http://stackoverflow.com/questions/21421031/eliminate-groups-which-have-different-values-in-r/21421184 und wohl ein Duplikat gegeben, dass alles, was Sie ändern müssen, ist '==' zu '> ', aber einige Dinge sind auch von diesen Antworten weggegangen. – thelatemail

Antwort

5

Wir filter verwenden mit n_distinct

library(dplyr) 
Data %>% 
    group_by(Session) %>% 
    filter(n_distinct(Rater)>1) 
# Session Rater 
# <fctr> <fctr> 
#1  B  Y 
#2  B  Y 
#3  B  Z 
#4  B  Z 
#5  C  X 
#6  C  Y 
#7  C  Z 

Oder mit data.table

library(data.table) 
setDT(Data)[, if(uniqueN(Rater)>1) .SD, by = Session] 

Oder mit base R

i1 <- rowSums(!!table(Data)) 
subset(Data, Session %in% names(i1)[i1 >1]) 
+1

Genau was ich brauchte. Danke für die vielen Möglichkeiten! – decaper

0

Ein anderer Weg ist aggregate

agg <- aggregate(data=zz, Rater ~ Session, function(x) length(unique(x))) 

agg 
# Session Rater 
#1  A  1 
#2  B  2 
#3  C  3 

zz[zz$Session %in% agg[agg$Rater > 1, "Session"], ] 

# Session Rater 
#4  B  Y 
#5  B  Y 
#6  B  Z 
#7  B  Z 
#8  C  X 
#9  C  Y 
#10  C  Z 
1

... oder mit ave() und Subskribierung verwendet (unter der Annahme Rater ist ein Faktor, der den Standardwert ist, wenn das Lesen von Zeichendaten)

Data[with(Data,ave(unclass(Rater),Session, 
FUN = function(x)length(unique(x)))) > 1,] 
Verwandte Themen