r subset difference

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]