【问题标题】:R for loop for filtering and summarizing dataframe (with dyplr)?用于过滤和汇总数据帧的 R for 循环(使用 dplyr)?
【发布时间】:2021-12-13 01:36:04
【问题描述】:

我使用 dyplr 的简单命令首先按两列过滤数据框,然后报告另一列的总和。但是,我想创建一个循环,以便过滤条件可以通过值列表自动执行。例如单个实例的代码:

library(dplyr)
df = data.frame(Category1 = sample(c("FilterMe","DoNotFilterMe"), 15, replace=TRUE), 
          Category2 = sample(c("1","3","5","10"),15, replace=TRUE),
          Value = 1:15)

df %>%
filter(Category1=="FilterMe" & Category2="1") %>%
summarize(result=sum(Value))

这很好用,我得到一个值 15。但是我想循环命令,以便我可以为由整数列表(非连续)定义的 Category2 执行多个值。我希望它为 i 的每个值循环并每次提供不同的输出值。我尝试了下面的代码,但留下了一个空值。

library(dplyr)
for (i in c(1,3,5,10){
df %>%
filter(Category1=="FilterMe" & Category2="i") %>%
summarize(result=sum(Value))}

如果除了循环之外还有其他方法可以实现相同的目标,我觉得很好。

【问题讨论】:

    标签: r loops for-loop dplyr filter


    【解决方案1】:

    如果我理解你想要做什么,你正在寻找 group_by。

    library(dplyr)
    df %>%
       filter(Category1 =="FilterMe") %>%
       group_by(Category2) %>%
       summarize(result=sum(Value))
    

    【讨论】:

      【解决方案2】:

      我们不需要循环。可以用%in%而不是==来简化,然后做group_bysum方法

      library(dplyr)
      df %>%
        filter(Category1=="FilterMe" & Category2 %in% c(1, 3, 5, 10)) %>%
        group_by(Category2) %>%
        summarize(result=sum(Value))
      

      -输出

      # A tibble: 4 × 2
        Category2 result
        <chr>      <int>
      1 1              4
      2 10            15
      3 3             17
      4 5             19
      

      使用for 循环,我们需要在每次迭代中存储输出,即list

      v1  <- c(1, 3, 5, 10)
      lst1 <- vector('list', length(v1))
      for (i in seq_along(v1)){
        lst1[[i]] <- df %>%
            filter(Category1=="FilterMe" & Category2 ==v1[i]) %>%
            summarize(result=sum(Value))
      
      }
      

      -输出

      > lst1
      [[1]]
        result
      1      4
      
      [[2]]
        result
      1     17
      
      [[3]]
        result
      1     19
      
      [[4]]
        result
      1     15
      

      或者可以直接将输出存储在listmap/lapply

      library(purrr)
      map(c(1, 3, 5, 10), ~ 
             df %>%
               filter(Category1 == "FilterMe", Category2 == .x) %>%
               summarise(result = sum(Value)))
      

      -输出

      [[1]]
        result
      1      4
      
      [[2]]
        result
      1     17
      
      [[3]]
        result
      1     19
      
      [[4]]
        result
      1     15
      

      【讨论】:

      • 非常感谢!我看到了你的更新,正是我需要的。
      猜你喜欢
      • 2019-07-28
      • 2017-10-04
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2019-12-20
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多