【问题标题】:count number of rows needed to have sum greater than a particular value in R计算总和大于 R 中特定值所需的行数
【发布时间】:2021-01-21 19:05:20
【问题描述】:

我想对数据框进行子集化,以使获取 mpg 值所需的行数至少为 100。

library(datasets)

data(mtcars)
head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

输出应该是前 5 个值 在 Hornet Sportabout 之后,这里的 mpg 总和 >100

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2

我想对 mpg 列的每一行进行校验和,然后输出为获得至少 100 的总和所需的行数

【问题讨论】:

  • 我认为 while 声明是您正在寻找的 datamentor.io/r-programming/while-loop
  • 谢谢。我希望它在每个步骤之后对上述所有 mpg 列行的校验和,然后输出为获得至少 100 的总和所需的行数。
  • 你能提供一个reprex吗?
  • @Bruno 我已更新问题以使其更清晰

标签: r dplyr tidyverse


【解决方案1】:

我会将cumsumlag 结合使用

library(dplyr)
    
mtcars %>% 
      filter(cumsum(lag(mpg, default = 0)) < 100) 

【讨论】:

    【解决方案2】:

    这应该可以解决

    library(tidyverse)
    
    
    df_answer <- mtcars %>% 
      rownames_to_column() %>% 
      tibble() %>% 
      mutate(cum_sum = cumsum(mpg)) %>% 
      filter(cum_sum < 100)
    
    df_answer %>% 
      nrow() + 1
    

    【讨论】:

      【解决方案3】:

      使用subset + cumsum 的基本 R 选项

      subset(mtcars, c(TRUE, cumsum(mpg) <= 100)[-nrow(mtcars)])
      

      给予

                         mpg cyl disp  hp drat    wt  qsec vs am gear carb
      Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
      Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
      Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
      Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
      Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
      

      【讨论】:

        【解决方案4】:

        您也可以使用purrr 库:

        library(purrr)
        which.max(purrr::accumulate(mtcars$mpg, `+`) > 100)
        
        # 5
        

        如果你想要整个数据集,你可以使用dplyr::slice:

        library(tidyverse)
        
        dplyr::slice(mtcars, 1 : which.max(purrr::accumulate(mtcars$mpg, `+`) > 100))
        
                           mpg cyl disp  hp drat    wt  qsec vs am gear carb
        Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
        Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
        Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
        Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
        Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
        

        【讨论】:

          【解决方案5】:

          您可以使用带有dplyr 的过滤条件:

          library(tidyverse)
          
          mtcars %>% 
            filter(row_number() %in% 1:(max(which(cumsum(mpg) < 100)) + 1))
          
                             mpg cyl disp  hp drat    wt  qsec vs am gear carb
          Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
          Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
          Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
          Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
          Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
          

          代码可以缩短为slice:

          mtcars %>% 
            slice(1:(max(which(cumsum(mpg) < 100)) + 1))
          

          并封装成函数:

          fnc = function(data, var, cutoff) {
            data %>% 
              slice(1:(max(which(cumsum({{var}}) < cutoff)) + 1))
          }
          
          fnc(mtcars, mpg, 100)
          #>                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
          #> Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
          #> Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
          #> Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
          #> Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
          #> Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
          
          fnc(iris, Sepal.Width, 10)
          #>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          #> 1          5.1         3.5          1.4         0.2  setosa
          #> 2          4.9         3.0          1.4         0.2  setosa
          #> 3          4.7         3.2          1.3         0.2  setosa
          #> 4          4.6         3.1          1.5         0.2  setosa
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-05
            • 1970-01-01
            相关资源
            最近更新 更多