2016-06-08 35 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,] 
相关问题