Seleccionar grupos con más de un valor distinto
subset difference (3)
Tu podrías intentar
library(dplyr)
df1 %>%
group_by(from) %>%
filter(n_distinct(number)>1)
# from number
#1 2 1
#2 2 2
O usando la
base R
indx <- rowSums(!!table(df1))>1
subset(df1, from %in% names(indx)[indx])
# from number
#3 2 1
#4 2 2
O
df1[with(df1, !ave(number, from, FUN=anyDuplicated)),]
# from number
#3 2 1
#4 2 2
Tengo datos con una variable de agrupación ("desde") y valores ("número"):
from number
1 1
1 1
2 1
2 2
3 2
3 2
Quiero subconjuntar los datos y seleccionar grupos que tengan dos o más valores únicos. En mis datos, solo el grupo 2 tiene más de un ''número'' distinto, por lo que este es el resultado deseado:
from number
2 1
2 2
Usando el concepto de varianza compartido por pero haciéndolo de manera 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
Varias posibilidades, aquí está mi favorito
library(data.table)
setDT(df)[, if(+var(number)) .SD, by = from]
# from number
# 1: 2 1
# 2: 2 2
Básicamente, por cada grupo estamos verificando si hay alguna variación, si es
TRUE
, luego devolvemos los valores del grupo
Con la base R, iría con
df[as.logical(with(df, ave(number, from, FUN = var))), ]
# from number
# 3 2 1
# 4 2 2
Editar
: para datos no numéricos, puede probar la nueva función
uniqueN
para
la versión
de
desarrollo
de
data.table
(o usar
length(unique(number)) > 1
lugar
setDT(df)[, if(uniqueN(number) > 1) .SD, by = from]