J'ai un bloc de données avec des données sur différentes personnes. Ils ressemblent à ceci:
Year Item ID 2005 a 1234 2005 b 1234 2005 a 4567 2005 b 4567 2006 a 4567 2006 a 7894
Mes données contiennent 45 000 observations et environ 1 000 ID différents et 10 années différentes. Je veux trouver les identifiants des personnes qui apparaissent dans plus d'un an, comment faire? J'ai pensé à séparer les données par identifiant et à voir si les données résultantes ont des années différentes, mais cela ne semble pas être le moyen le plus intelligent de le faire
3 Réponses :
divisez l ' année par ID , puis ne conservez que les sous-groupes qui ont plus d'un code année code unique > #DATA
df1 = structure(list(Year = c(2005L, 2005L, 2005L, 2005L, 2006L, 2006L),
Item = c("a", "b", "a", "b", "a", "a"), ID = c(1234L, 1234L, 4567L, 4567L, 4567L, 7894L)),
class = "data.frame",
row.names = c(NA, -6L))
list1 = lapply(split(df1$Year, df1$ID), unique)
list1 = list1[lengths(list1) > 1]
data.frame(ID = names(list1), count = lengths(list1))
# ID count
#4567 4567 2
Avec dplyr , nous pouvons utiliser n_distinct et obtenir uniquement ces ID qui ont plus d'un an.
unique(df$ID)[rowSums(table(df$ID, df$Year) > 0) > 1] #[1] 4567
Une alternative de base R avec table
library(dplyr) df %>% group_by(ID) %>% filter(n_distinct(Year) > 1) %>% pull(ID) %>% unique #[1] 4567
Nous pouvons obtenir les identifiants dupliqués, puis les récupérer dans ceux-ci:
Dups<-df[duplicated(df$ID),] Dups[duplicated(Dups$ID),]["ID"] # ID # 5 4567