【问题标题】:Select groups with more than one distinct value选择具有多个不同值的组
【发布时间】:2015-10-17 09:35:58
【问题描述】:

我有一个分组变量(“from”)和值(“number”)的数据:

from number
   1      1
   1      1
   2      1
   2      2
   3      2
   3      2

我想对数据进行子集化并选择具有两个或多个唯一值的组。在我的数据中,只有第 2 组有多个不同的“数字”,所以这是期望的结果:

from number
   2      1
   2      2

【问题讨论】:

  • 我对你的问题有疑问。假设在from =2,数字是1 2 1。这符合子集标准吗?

标签: r subset difference


【解决方案1】:

几种可能,这是我最喜欢的

library(data.table)
setDT(df)[, if(+var(number)) .SD, by = from]
#    from number
# 1:    2      1
# 2:    2      2

基本上,我们检查每个组是否有任何差异,如果TRUE,则返回组值


使用基础 R,我会选择

df[as.logical(with(df, ave(number, from, FUN = var))), ]
#   from number
# 3    2      1
# 4    2      2

编辑:对于非数字数据,您可以尝试为the devel versiondata.table 使用新的uniqueN 函数(或改用length(unique(number)) > 1

setDT(df)[, if(uniqueN(number) > 1) .SD, by = from]

【讨论】:

  • 我的真实数据并不简单。它是名称字符串。可能是同样的问题?
  • 如果不是数字,请使用开发版中的uniqueN 函数,例如setDT(df)[, if(uniqueN(number) > 1) .SD, by = from]。如果您没有开发版本,请尝试使用setDT(df)[, if(length(unique(number)) > 1) .SD, by = from]Link for the devel version
【解决方案2】:

你可以试试

 library(dplyr)
 df1 %>% 
     group_by(from) %>%
     filter(n_distinct(number)>1)
 #    from number
 #1    2      1
 #2    2      2

或使用base R

 indx <- rowSums(!!table(df1))>1
 subset(df1, from %in% names(indx)[indx])
 #   from number
 #3    2      1
 #4    2      2

或者

  df1[with(df1, !ave(number, from, FUN=anyDuplicated)),]
  #   from number
  #3    2      1
  #4    2      2

【讨论】:

  • 不错的替代品(我在想n_distinct 但留给你了 :)),虽然最后一个可能具有误导性,所以我不会使用它
【解决方案3】:

使用David 共享的方差概念,但以 dplyr 方式进行:

library(dplyr) 
df %>% 
   group_by(from) %>% 
   mutate(variance=var(number)) %>% 
   filter(variance!=0) %>% 
   select(from,number)

    #Source: local data frame [2 x 2]
    #Groups: from

       #from number
   #1    2      1
   #2    2      2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2012-03-03
    • 2023-01-09
    • 1970-01-01
    相关资源
    最近更新 更多