如何仅对R中另一列中具有多个不同值的行进行子集化?

时间:2016-06-08 04:52:52

标签: r dplyr subset

我有一个类似于下面的数据集:

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)

我想只对会话有多个raters的会话行进行子集化,即使该数据存储在另一列中。因此,我想得到一个如下所示的数据集:

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)

其中会话A从数据集中删除了行,因为会话A只有一个评估者,“X”,但会话B和C(及其所有行)都被保留,因为他们有多个评估者(Y&amp; Z)对于会话B,以及会话C的X,Y和&amp; Z)。

我和dplyr一起玩过,但没有成功。非常感谢。

2 个答案:

答案 0 :(得分: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 :(得分:1)

...或使用ave()和下标(假设Rater是一个因素,这是读取字符数据时的默认值)

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