Select 个具有多个不同值的组
Select groups with more than one distinct value
我有包含分组变量 ("from") 和值 ("number") 的数据:
from number
1 1
1 1
2 1
2 2
3 2
3 2
我想对具有两个或更多唯一值的数据和 select 组进行子集化。在我的数据中,只有第 2 组有多个不同的 'number',所以这是期望的结果:
from number
2 1
2 2
多种可能性,这是我最喜欢的
library(data.table)
setDT(df)[, if(+var(number)) .SD, by = from]
# from number
# 1: 2 1
# 2: 2 2
基本上,我们检查每个组是否存在差异,如果 TRUE
,则 return 组值
对于基础 R,我会选择
df[as.logical(with(df, ave(number, from, FUN = var))), ]
# from number
# 3 2 1
# 4 2 2
Edit:对于非数值数据,您可以尝试新的 uniqueN
函数 for the devel version of data.table
(或使用 length(unique(number)) > 1
而不是
setDT(df)[, if(uniqueN(number) > 1) .SD, by = from]
使用 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
你可以试试
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
我有包含分组变量 ("from") 和值 ("number") 的数据:
from number
1 1
1 1
2 1
2 2
3 2
3 2
我想对具有两个或更多唯一值的数据和 select 组进行子集化。在我的数据中,只有第 2 组有多个不同的 'number',所以这是期望的结果:
from number
2 1
2 2
多种可能性,这是我最喜欢的
library(data.table)
setDT(df)[, if(+var(number)) .SD, by = from]
# from number
# 1: 2 1
# 2: 2 2
基本上,我们检查每个组是否存在差异,如果 TRUE
,则 return 组值
对于基础 R,我会选择
df[as.logical(with(df, ave(number, from, FUN = var))), ]
# from number
# 3 2 1
# 4 2 2
Edit:对于非数值数据,您可以尝试新的 uniqueN
函数 for the devel version of data.table
(或使用 length(unique(number)) > 1
而不是
setDT(df)[, if(uniqueN(number) > 1) .SD, by = from]
使用 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
你可以试试
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