【问题标题】:How to select top 3 columns/variables according to the sum values of each column?如何根据每列的总和值选择前 3 列/变量?
【发布时间】:2019-07-27 06:10:21
【问题描述】:

我有一个这样的数据集

>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

我想选择总和值最大的 3 列,显示顺序、列名和总和值,并将它们按降序排列。像这样:

1 eggs  23
2 bread 22
3 juice 20

我该怎么做?

非常感谢您的帮助!

【问题讨论】:

  • 我建议使用gather-grouby-summarise-top_n 方法。

标签: r select


【解决方案1】:

使用dplyr 和tidyr:

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

数据:

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

【讨论】:

    【解决方案2】:

    原答案

    在base R中,您可以找到每一列的值的总和,排序结果值在递减顺序,子集 前3个值和cbind它们以获得所需的输出:

    cbind(sort(colSums(dat), T)[1:3])
    
    #      [,1]
    #eggs    23
    #bread   22
    #juice   20
    

    更新答案

    ...我怎样才能从这个解决方案返回到原始数据集?...

    这里我子集由names设置的原始数据集对应于具有三个最大列总和的列。可能有更好的解决方案,这是我现在能找到的。

    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
    

    数据:

    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
    )
    

    【讨论】:

    • 又好又简单!您知道如何从该解决方案返回原始数据集吗?例如撤消colSums?
    【解决方案3】:

    看看这个小例子:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多