J'essaie d'écrire du code, de préférence en utilisant data.table, pour regrouper les données par id à partir d'une colonne de liste avec des plages (my_range) dans un nouvel ensemble de données agrégé avec une colonne ({{X3} }) contenant l'union de my_range pour chaque id.

library(data.table)

#Input
d <- data.table(id=c(1,1,2,2),
                my_range=list(1:5,2:6,3:7,9:9)
                )

#Desired output:
g <- data.table(id=c(1,2),
                union_of_my_range=list(c(1:5,6),c(3:7,9))
                )

Cherche de préférence une solution data.table,

Voici ce que j'ai jusqu'à présent:

d[, .(my_range_union = SOMETING unon my_range ) ,id]

Mais je ne suis pas en mesure de suivre toutes les listes interagissant dans l'étape d'agrégation

1
LucasMation 6 nov. 2020 à 08:01

2 réponses

Meilleure réponse

Nous pouvons utiliser Reduce avec union

d[, .(my_range_union = list(Reduce(union, my_range))), id]
#   id my_range_union
#1:  1    1,2,3,4,5,6
#2:  2    3,4,5,6,7,9
1
akrun 6 nov. 2020 à 21:05

Vous pouvez unlist my_range valeurs, rassembler unique valeurs et les mettre dans une nouvelle liste.

library(data.table)
d[, .(my_range_union = list(unique(unlist(my_range)))) ,id]

#   id my_range_union
#1:  1    1,2,3,4,5,6
#2:  2    3,4,5,6,7,9
1
Ronak Shah 6 nov. 2020 à 05:03