Regroupement de lignes d'un data frame par identifiant

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Lorenzo Barrail
Messages : 13
Enregistré le : 23 Sep 2020, 07:45

Regroupement de lignes d'un data frame par identifiant

Messagepar Lorenzo Barrail » 08 Oct 2021, 08:31

Bonjour à tous,

Je souhaiterais transformer ce type de dataframe, en enlevant les zéros et en groupant par identifiant (a, b, c)

Code : Tout sélectionner

a=c(0,0,3,NA)
b=c(0,2,0,NA)
c=c(7,0,0,NA)
d=c(8,0,NA,NA)
e=c(0,1,NA,NA)
f=c(4,0,0,0)
g=c(0,2,0,0)
h=c(0,0,0,1)
i=c(0,0,7,0)

data=data.frame(a,b,c,d,e,f,g,h,i)
data2=t(data)
colnames(data2)=c("ocs1","ocs2","ocs3","ocs4")
rownames(data2)=c("a","a","a","b","b","c","c","c","c")


Pour donner ce tableau:


Code : Tout sélectionner

a=c(7,2,3,NA)
b=c(8,1,NA,NA)
c=c(4,2,7,1)

data=data.frame(a,b,c)
data2=t(data)
data2
colnames(data2)=c("ocs1","ocs2","ocs3","ocs4")


Je ne sais pas si c'est la meilleure manière de vous présenter le problème, mais en le jouant vous verrez bien les deux tableaux.

Merci d'avance!

Lorenzo

Facundo Muñoz
Messages : 156
Enregistré le : 04 Juil 2019, 09:58
Contact :

Re: Regroupement de lignes d'un data frame par identifiant

Messagepar Facundo Muñoz » 08 Oct 2021, 10:09

Code : Tout sélectionner

dat <- structure(
  c(0, 0, 7, 8, 0, 4, 0, 0, 0, 0, 2, 0, 0, 1, 0, 2, 0, 0, 3,
    0, 0, NA, NA, 0, 0, 0, 7, NA, NA, NA, NA, NA, 0, 0, 1, 0
  ),
  .Dim = c(9L, 4L),
  .Dimnames = list(
    c("a", "a", "a", "b", "b", "c", "c", "c", "c"),
    c("ocs1", "ocs2", "ocs3", "ocs4"))
)

target <- structure(
  c(7, 8, 4, 2, 1, 2, 3, NA, 7, NA, NA, 1),
  .Dim = 3:4,
  .Dimnames = list(
    c("a", "b", "c"),
    c("ocs1", "ocs2", "ocs3", "ocs4"))
)

## En supposant que les éléments de chaque "groupe" dans chaque variable :
## 1. tous ses éléments sont soit NA, soit numériques
## 2. si numériques, tous sont 0 sauf exactement 1
res <- aggregate(dat, by = list(rownames(dat)), max)

## Convertir en matrice (pour réproduire l'objectif)
ans <- as.matrix(res[, -1])
rownames(ans) <- res[, 1]

identical(ans, target)
#> [1] TRUE
ƒacu.-

Lorenzo Barrail
Messages : 13
Enregistré le : 23 Sep 2020, 07:45

Re: Regroupement de lignes d'un data frame par identifiant

Messagepar Lorenzo Barrail » 08 Oct 2021, 10:47

Super merci beaucoup! :)


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité