2
votes

Comment prendre la valeur non manquante associée à l'index max pour chaque groupe à l'aide de summary_all

Je veux trouver la valeur non manquante de chaque groupe associée à la plus grande valeur d'index, pour de nombreuses colonnes.

Je suis devenu assez proche en utilisant summary_all avec which.max mais je ne sais pas comment supprimer le NA de chaque vecteur avant de trouver la dernière valeur. J'ai lu sur l'utilisation de na.rm dans summary_all avec des fonctions comme mean mais je ne sais pas comment incorporer des fonctionnalités similaires sans fonction intégrée. J'ai essayé na.omit mais il ne fournit pas la solution que je recherche.

a <- head(iris, 10)
a$num <- 1:10
a$grp <- c("a","a","a","b","b","c","c","d","d","d")
a[10, "Species"] <- NA
a %>%
  group_by(grp) %>%
  summarize_all(funs(na.omit(.)[which.max(num)]))

grp   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   num
<chr>          <dbl>       <dbl>        <dbl>       <dbl> <fct>   <int>
1 a             4.70        3.20         1.30       0.200 setosa      3
2 b             5.00        3.60         1.40       0.200 setosa      5
3 c             4.60        3.40         1.40       0.300 setosa      7
4 d             4.90        3.10         1.50       0.100 NA         10

Je m'attends à ce que toutes les valeurs de la colonne Species soient setosa, mais la dernière valeur est NA.


0 commentaires

3 Réponses :


1
votes

si vous utilisez une approche data.table, vous pouvez essayer:

library (data.table)
a = data.table (a)
a [is.finite (Species), by = grp, .SD [which.max (num) ] ]


0 commentaires

1
votes

Au lieu de regarder tous les nombres , nous pouvons regarder seulement ceux où la variable correspondante n'est pas NA:

a %>%
  group_by(grp) %>%
  summarize_all(funs(na.omit(.)[which.max(num[!is.na(.)])]))
# A tibble: 4 x 7
#   grp   Sepal.Length Sepal.Width Petal.Length Petal.Width Species   num
#   <chr>        <dbl>       <dbl>        <dbl>       <dbl> <fct>   <int>
# 1 a              4.7         3.2          1.3         0.2 setosa      3
# 2 b              5           3.6          1.4         0.2 setosa      5
# 3 c              4.6         3.4          1.4         0.3 setosa      7
# 4 d              4.9         3.1          1.5         0.1 setosa     10


8 commentaires

Pas besoin de na.omit (.) , summary_all (funs (. [Which.max (number [! Is.na (.)])])) a fait le emploi.


Merci @Julius Vainora! très utile.


J'ai rencontré un problème intéressant avec cette approche. J'ai exécuté le code ci-dessus sur mon ensemble de données et j'avais quelques enregistrements qui contenaient encore des NA. Après de nombreuses recherches, cela semble avoir quelque chose à voir avec l'ordre des lignes. Vous pouvez voir ce que je veux dire avec l'exemple ci-dessous. a <- head (iris, 15) a $ num <- 1:15 a $ grp <- c ("a", "a", "a", "b", "b", "c" , "c", "d", "d", "d", "d", "d", "d", "d", "d‌") a [c (12, 13), "Petal. Largeur "] <- NA a <- a%>% arrange (c (1:11, 14, 13, 12, 15)) #a <- rbind (a, a [12:14,]) #a [10 , "Species"] <- NA a%>% group_by (grp)%>% summary_all (funs (. [Which.max (num [! Is.na (.)])]))


@HunterClark, je pense que c'était une erreur de laisser tomber na.omit après tout. Qu'en est-il des funs (na.omit (.) [Which.max (num [! Is.na (.)])]) ? Cela semble fonctionner. En effet, la suppression de na.omit a introduit le désordre.


Merci encore @Julius. cela semble fonctionner. Je ne comprends pas pourquoi le problème est survenu ...


@HunterClark, num [! Is.na (.)] est un sous-vecteur de num où la variable correspondante (. ) n'est pas NA . Ainsi, ce sous-vecteur peut être plus court que num . Ensuite, which.max renvoie un index dans ce sous-vecteur potentiellement plus court. Ensuite, faire . [Which.max (num [! Is.na (.)])] était faux car la variable correspondante n'a pas été raccourcie avant le sous-ensemble. na.omit (.) l'aligne avec num [! is.na (.)] .


@Julius, ahhhhhh. merci beaucoup pour la clarification. Souhaitez-vous ajuster votre réponse ou devrais-je modifier le message principal pour mettre à jour les informations?


@HunterClark, tout va bien avec votre question et j'ai déjà effacé l'erreur de ma réponse.



1
votes

Vous pouvez également aborder cela un peu différemment et remplir d'abord le cas NA :

library(tidyverse)

a %>% group_by(grp) %>% 
  fill(Species) %>% 
  filter(num == max(num))

tibble: 4 x 7
# Groups:   grp [4]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species   num grp  
         <dbl>       <dbl>        <dbl>       <dbl> <fct>   <int> <chr>
1          4.7         3.2          1.3         0.2 setosa      3 a    
2          5           3.6          1.4         0.2 setosa      5 b    
3          4.6         3.4          1.4         0.3 setosa      7 c    
4          4.9         3.1          1.5         0.1 setosa     10 d 


1 commentaires

Merci pour la réponse Mako212. Bien que votre réponse fonctionne très bien pour le cas de l'exemple, la recherche de remplissage peut entraîner des difficultés si l'index n'est pas trié auparavant. Pour cette raison, j'opterai pour la réponse de Julius mais je garderai le remplissage à l'esprit pour l'avenir.