2016-06-08 25 views
1

我有類似下面一個數據集:如何僅對R中另一列具有多個不同值的行進行子集分類?

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) 

我想只子集該會議有多個評價者會話行,即使該數據存儲在另一列。因此,我想結束了一個數據集,看起來像這樣:

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) 

當會話一個行被從數據集中刪除,因爲會話一個只有一個評價者,「X」,但會議B和C(和它們的所有行)被保留,因爲它們具有多於一個評估者(對於會話B是Y & Z,對於會話C是X,Y,& Z)。

我玩過dplyr,但沒有成功。非常感謝。

+1

本質上在http://stackoverflow.com/questions/21421031/eliminate-groups-which-have-different-values-in-r/21421184的對面,可以說是一個重複的假設,你必須改變'=='到'> ',但有些事情也從這些答案中轉移了出來。 – thelatemail

回答

5

我們可以用filtern_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 

或者使用data.table

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

或用base R

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

正是我所需要的。感謝您的多種選擇! – decaper

0

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

...或使用AVE()和下標(假設評價者是一個因素,讀取字符數據時,這是缺省值)

Data[with(Data,ave(unclass(Rater),Session, 
FUN = function(x)length(unique(x)))) > 1,] 
相關問題