1
votes

Comment sélectionner les 3 premières colonnes / variables en fonction des valeurs de somme de chaque colonne?

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!


1 commentaires

Je suggérerais une approche rassembler un groupe par un résumé-dessus .


3 Réponses :


0
votes

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)]


0 commentaires

1
votes

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


0 commentaires

1
votes

Réponse d'origine

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
)

Réponse mise à jour

... 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

Données:

cbind(sort(colSums(dat), T)[1:3])

#      [,1]
#eggs    23
#bread   22
#juice   20

1 commentaires

Sympa et simple! Savez-vous comment je peux revenir à l'ensemble de données d'origine à partir de cette solution? Par exemple annuler colSums ?