2 votes

Déplacer des variables uniques dans des sous-ensembles de données en r

J'ai un ensemble de données en R qui ressemble à ce qui suit :

ID membre  ID d'inscription ...
1          111
1          111
1          112
2          113
2          114
3          115
...

Mon objectif est de diviser les données originales et de créer des sous-ensembles de données où il n'y a pas de "ID membres" qui ont plusieurs "ID d'inscription". Cependant, les doublons (comme le cas du membre 1 avec l'ID d'inscription 111) ne devraient pas être supprimés et devraient rester.

Dans cet exemple :

Ensemble de données 1:

ID membre ID d'inscription
1          111
1          111
2          113
3          115

Ensemble de données 2:

ID membre ID d'inscription
1          112
2          114

Mon ensemble de données est beaucoup plus grand et la sortie finale comporterait probablement environ 100 sous-ensembles de données.

Pouvez-vous s'il vous plaît m'aider avec cela?

Merci beaucoup!

0voto

www Points 27760

Nous pouvons créer un identifiant de longueur d'exécution pour chaque ID de membre. Ensuite, divisez le cadre de données par identifiant de longueur d'exécution. Dans l'exemple suivant, les sorties finales sont toutes dans dt_list2.

# Charger les packages
library(dplyr)
library(data.table)

# Créer un exemple de cadre de données
dt <- read.table(text = "'Member ID'  'Listing ID'
                 1          111
                 1          111
                 1          112
                 2          113
                 2          114
                 3          115", 
                 header = TRUE, stringsAsFactors = FALSE)

# Ajouter l'identifiant de longueur d'exécution
dt2 <- dt %>%
  setNames(nm = c("Member ID", "Listing ID")) %>%
  group_by(`Member ID`) %>%
  mutate(RL = rleid(`Listing ID`))

# Diviser le cadre de données par identifiant de longueur d'exécution
dt_list <- split(dt2, f = dt2$RL)

# Supprimer l'identifiant de longueur d'exécution pour chaque cadre de données
dt_list2 <- lapply(dt_list, function(dt){
  dt$RL <- NULL
  return(dt)
})

0voto

thelatemail Points 21202

Je pense que cela fera l'affaire :

split(dt, (duplicated(dt) | duplicated(dt,fromLast=TRUE)) | (!duplicated(dt$Member.ID)))

#$`FALSE`
#  Member.ID Listing.ID
#3         1        112
#5         2        114
#
#$`TRUE`
#  Member.ID Listing.ID
#1         1        111
#2         1        111
#4         2        113
#6         3        115

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X