【问题标题】:How to subset only the rows that have multiple, different values in another column in R?如何仅对 R 中另一列中具有多个不同值的行进行子集化?
【发布时间】:2016-06-08 04:52:52
【问题描述】:

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

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)

会话 A 的行已从数据集中删除,因为会话 A 只有一个评估者“X”,但会话 B 和 C(及其所有行)被保留,因为它们有多个评估者(Y 和 Z会话 B,以及会话 C 的 X、Y 和 Z)。

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

【问题讨论】:

标签: r dplyr subset


【解决方案1】:

我们可以使用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])

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-16
      • 2018-02-01
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多