J'ai un ensemble de données comme celui-ci
1 eggs 23 2 bread 22 3 juice 20
Je veux sélectionner 3 colonnes qui ont les plus grandes valeurs de somme, en affichant l'ordre, le nom de la colonne et les valeurs de somme, et les placer dans l'ordre décroissant. Comme ceci:
>head(grocery) milk bread juice honey eggs beef ... (140 more variables) 1 4 3 1 4 2 2 5 4 2 4 3 1 2 6 0 7 0 0 1 5 3 3 1 4 10 2 1 5 8
Comment puis-je faire cela?
Merci beaucoup pour votre aide!
3 Réponses :
Jetez un œil à ce petit exemple:
data <- NULL data$c <- c(1,2,3,4) data$b <- c(4,5,6,7) data$a <- c(1,1,1,1) apply(data, 2, sum) arraysum <- NULL for(i in names(data)){ arraysum$name <- append(arraysum$name,i) arraysum$sum <- append(arraysum$sum, sum(data[[i]])) } arraysum$sum arraysum$name[order(arraysum$sum, decreasing = T)]
Avec dplyr
et tidyr
:
df <- structure(list(milk = c(1L, 2L, 1L, 0L, 4L), bread = c(4L, 5L, 2L, 1L, 10L), juice = c(3L, 4L, 6L, 5L, 2L), honey = c(1L, 2L, 0L, 3L, 1L), eggs = c(4L, 4L, 7L, 3L, 5L), beef = c(2L, 3L, 0L, 1L, 8L)), class = "data.frame", row.names = c(NA, -5L))
library(dplyr) library(tidyr) df %>% gather(key,value) %>% group_by(key) %>% summarise(Sum=sum(value)) %>% arrange(desc(Sum)) %>% top_n(3,Sum) # A tibble: 3 x 2 key Sum <chr> <int> 1 eggs 23 2 bread 22 3 juice 20
Dans la base R , vous pouvez trouver des sommes de valeurs pour chaque colonne , trier les valeurs résultantes en ordre décroissant , sous-ensemble 3 premières valeurs et cbind
pour obtenir le résultat souhaité: p>
dat <- read.table( text = "milk bread juice honey eggs beef 1 4 3 1 4 2 2 5 4 2 4 3 1 2 6 0 7 0 0 1 5 3 3 1 4 10 2 1 5 8", stringsAsFactors = F, header = T )
... comment puis-je revenir à l'ensemble de données d'origine à partir de cette solution? ...
Ici, je sous-ensemble l'ensemble de données d'origine par noms correspondant à des colonnes avec trois plus grosses sommes de colonnes . Il existe probablement une meilleure solution, celle-là que je peux trouver en ce moment.
dat[, names(sort(colSums(dat), T)[1:3])] # eggs bread juice #1 4 4 3 #2 4 5 4 #3 7 2 6 #4 3 1 5 #5 5 10 2
cbind(sort(colSums(dat), T)[1:3]) # [,1] #eggs 23 #bread 22 #juice 20
Sympa et simple! Savez-vous comment je peux revenir à l'ensemble de données d'origine à partir de cette solution? Par exemple annuler colSums
?
Je suggérerais une approche
rassembler un groupe par un résumé-dessus
.