【问题标题】:Sorting and calculating sum and rank with new columns in R使用 R 中的新列对总和和排名进行排序和计算
【发布时间】:2018-05-12 17:15:51
【问题描述】:

我有 200 列,想要计算平均值和排名,然后生成列。这是一个数据示例

df<-read.table(text="Q1a    Q2a Q3b Q4c Q5a Q6c Q7b
1   2   4   2   2   0   1
3   2   1   2   2   1   1
4   3   2   1   1   1   1",h=T)

我想将每一行的 a、b 和 c 相加,然后将它们相加。接下来我想计算每一行的排名。我要生成下表:

Q1a Q2a Q3b Q4c Q5a Q6c Q7b a   b   c   Total   Rank
1   2   4   2   2   0   1   5   5   2   12  2
3   2   1   2   2   1   1   7   2   3   12  2
4   3   2   1   1   1   1   8   3   2   13  1

【问题讨论】:

    标签: r


    【解决方案1】:
    library(dplyr)
    
    df %>%
      cbind(sapply(c('a', 'b', 'c'), function(x) rowSums(.[, grep(x, names(.)), drop=FALSE]))) %>%
      mutate(Total = a + b + c, 
             Rank = match(Total, sort(Total, decreasing = T)))
    

    输出为:

      Q1a Q2a Q3b Q4c Q5a Q6c Q7b a b c Total Rank
    1   1   2   4   2   2   0   1 5 5 2    12    2
    2   3   2   1   2   2   1   1 7 2 3    12    2
    3   4   3   2   1   1   1   1 8 3 2    13    1
    

    样本数据:

    df <- structure(list(Q1a = c(1L, 3L, 4L), Q2a = c(2L, 2L, 3L), Q3b = c(4L, 
    1L, 2L), Q4c = c(2L, 2L, 1L), Q5a = c(2L, 2L, 1L), Q6c = c(0L, 
    1L, 1L), Q7b = c(1L, 1L, 1L)), class = "data.frame", row.names = c(NA, 
    -3L))
    

    【讨论】:

      【解决方案2】:

      您也可以使用tidyverse 方法。但是,它更长。

      library(tidyverse)
      
      df %>%
          rownames_to_column(var = "ID") %>%
          gather(question, value, -ID) %>% 
          mutate(type = substr(question, 3,3)) %>% 
          group_by(ID, type) %>% 
          summarise(sumType = sum(value, na.rm = TRUE)) %>% 
          as.data.frame() %>%
          spread(type, sumType) %>% 
          mutate(Total = a+b+c, 
                 Rank =  match(Total, sort(Total, decreasing = T)))
      

      结果:

        ID a b c Total Rank
      1  1 5 5 2    12    2
      2  2 7 2 3    12    2
      3  3 8 3 2    13    1
      

      【讨论】:

        猜你喜欢
        • 2018-06-09
        • 1970-01-01
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多