【问题标题】:Count number of values which are less than current value计算小于当前值的值的数量
【发布时间】:2018-11-23 16:07:03
【问题描述】:

如果值小于当前行,我想计算列 input 中的行数(请参阅下面想要的结果)。对我来说问题是条件基于当前行值,因此它与条件是固定数字的一般情况有很大不同。

data <- data.frame(input = c(1,1,1,1,2,2,3,5,5,5,5,6))

    input
1      1
2      1
3      1
4      1
5      2
6      2
7      3
8      5
9      5
10     5
11     5
12     6

我期望得到的结果是这样的。例如,对于观测值 5 和 6(值为 2),有 4 个观测值的值 1 小于它们的值 2。因此 count 的值为 4。

    input count
1      1     0
2      1     0
3      1     0
4      1     0
5      2     4
6      2     4
7      3     6
8      5     7
9      5     7
10     5     7
11     5     7
12     6    11

编辑:当我使用dplyr 处理分组数据时,我希望得到的最终结果如下所示,也就是说,我希望每个组内的条件可以是动态的。

data <- data.frame(id = c(1,1,2,2,2,3,3,4,4,4,4,4), 
input = c(1,1,1,1,2,2,3,5,5,5,5,6), 
count=c(0,0,0,0,2,0,1,0,0,0,0,4))

   id input count
1   1     1     0
2   1     1     0
3   2     1     0
4   2     1     0
5   2     2     2
6   3     2     0
7   3     3     1
8   4     5     0
9   4     5     0
10  4     5     0
11  4     5     0
12  4     6     4

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是tidyverse的选项

    library(tidyverse)
    data %>%
       mutate(count = map_int(input, ~ sum(.x > input))) 
    #    input count
    #1      1     0
    #2      1     0
    #3      1     0
    #4      1     0
    #5      2     4
    #6      2     4
    #7      3     6
    #8      5     7
    #9      5     7
    #10     5     7
    #11     5     7
    #12     6    11
    

    更新

    使用更新的数据,在上面的代码中按'id'添加分组

    data %>% 
      group_by(id) %>% 
      mutate(count1 = map_int(input, ~ sum(.x > input)))
    # A tibble: 12 x 4
    # Groups:   id [4]
    #      id input count count1
    #   <dbl> <dbl> <dbl>  <int>
    # 1     1     1     0      0
    # 2     1     1     0      0
    # 3     2     1     0      0
    # 4     2     1     0      0
    # 5     2     2     2      2
    # 6     3     2     0      0
    # 7     3     3     1      1
    # 8     4     5     0      0
    # 9     4     5     0      0
    #10     4     5     0      0
    #11     4     5     0      0
    #12     4     6     4      4
    

    【讨论】:

      【解决方案2】:

      在基数 R 中,我们可以使用 sapply 并为每个 input 计算有多少值大于自身。

      data$count <- sapply(data$input, function(x) sum(x > data$input))
      
      data
      
      #   input count
      #1      1     0
      #2      1     0
      #3      1     0
      #4      1     0
      #5      2     4
      #6      2     4
      #7      3     6
      #8      5     7
      #9      5     7
      #10     5     7
      #11     5     7
      #12     6    11
      

      对于dplyr,一种方法是使用rowwise 函数并遵循相同的逻辑。

      library(dplyr)
      
      data %>%
        rowwise() %>%
        mutate(count = sum(input > data$input))
      

      【讨论】:

      • 非常感谢您的回答!由于我正在使用 dplyr 处理组数据,并且我提供的示例数据集是我实际数据集中的组之一,我只是想知道是否有使用 dplyr 的方法(例如使用 mutate)。谢谢!
      • @RickXMan 我已经展示了在您的示例答案中使用mutate 的方法。
      • 感谢@Ronak Shah。我尝试在它之前添加group_by,但似乎rowwisegroup_by 不兼容?
      【解决方案3】:

      1outerrowSums

      data$count <- with(data, rowSums(outer(input, input, `>`)))
      

      2tablecumsum

      tt <- cumsum(table(data$input))
      v <- setNames(c(0, head(tt, -1)), c(head(names(tt), -1), tail(names(tt), 1)))
      data$count <- v[match(data$input, names(v))]
      

      3data.table非等加入

      data.table 中使用非等连接可能更有效。计算每个匹配项 (by = .EACHI) 的行数 (.N)。

      library(data.table)
      setDT(data)
      data[data, on = .(input < input), .N, by = .EACHI]
      

      如果您的数据按“id”分组,如在您的更新中,也加入该变量:

      data[data, on = .(id, input < input), .N, by = .EACHI]
      
      #     id input N
      #  1:  1     1 0
      #  2:  1     1 0
      #  3:  2     1 0
      #  4:  2     1 0
      #  5:  2     2 2
      #  6:  3     2 0
      #  7:  3     3 1
      #  8:  4     5 0
      #  9:  4     5 0
      # 10:  4     5 0
      # 11:  4     5 0
      # 12:  4     6 4
      

      【讨论】:

        猜你喜欢
        • 2020-10-30
        • 1970-01-01
        • 2022-06-10
        • 2013-05-04
        • 1970-01-01
        • 2021-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多