代码之家  ›  专栏  ›  技术社区  ›  Jacob Bruno

根据一系列其他列中是否有条件标记(Y/N),将一列(A)中的值相加

  •  1
  • Jacob Bruno  · 技术社区  · 7 月前

    我希望根据它们是否标记在一系列其他列中来总结一列中的所有值。我在tibble上创建了每个月的数字表示。

    months <- tibble(month = 1:12, count = NA) 
    

    在一个单独的tibble中,我有一个标记为“是”或“否”的五行示例。此代码的预期目标是计数。如果标识为“y”,则可以对每个月的计数进行求和,并将该总和显示在原始的“month”tibble中。如果一个月被标记为“n”,则没有任何操作。这里的例子中,1月份的计数为81,2月份为246(40、125、81标记为“y”表示2月份。

      relevant_months<- tibble(count = c(40 ,125, 77, 81, 321), 
                               "1" = c("n", "n", "n", "y", "n"),
                               "2" = c("y", "y", "n", "y", "n"),
                               "3" = c("n", "n", "n", "n", "n"),
                               "4" = c("y", "n", "n", "n", "y"),
                               "5" = c("y", "n", "n", "n", "n"),
                               "6" = c("n", "n", "n", "n", "n"),
                               "7" = c("n", "y", "y", "n", "y"),
                               "8" = c("n", "y", "y", "y", "n"),
                               "9" = c("n", "y", "n", "n", "y"),
                               "10" = c("n", "n", "n", "y", "n"),
                               "11" = c("n", "n", "n", "n", "n"),
                               "12" = c("y", "y", "n", "n", "n"))
    

    该代码的预期目标是根据每月列中的标识符有条件地执行此计数求和,然后在初始表中显示每月的总数。

    3 回复  |  直到 7 月前
        1
  •  3
  •   jpsmith    7 月前

    你可以使用 tidyr::pivot_longer 以及条件求和:

    relevant_months %>%
      pivot_longer(-count, names_to = "month") %>%
      summarize(count = sum(count[value %in% "y"]),
                .by = month)
    

    输出:

       month  count
       <chr> <dbl>
     1 1        81
     2 2       246
     3 3         0
     4 4       361
     5 5        40
     6 6         0
     7 7       523
     8 8       283
     9 9       446
    10 10       81
    11 11        0
    12 12      165
    
        2
  •  0
  •   yuk    7 月前

    像这样的事情?

    relevant_months %>% 
      gather("month", "flag", -count) %>% 
      summarise(count = sum(count * (flag == "y")), .by = "month")
    
        3
  •  0
  •   phili_b    7 月前
    library(tidyverse)
    
    
    
    mysum <- ( 
      
        relevant_months
        %>% summarise(
            across(everything(),
               ~ (function (var,val) {
                    
                   if (var!='mycount'){          
               
                     sum(ifelse(val=='y',mycount,0), na.rm = TRUE) 
                   } else NA
                  })(cur_column(), .)
            )
        )
      )
    
    
    rbind(
      relevant_months,
      mysum
    )
    
    t(mysum)
    

    结果:

    # A tibble: 6 x 13
      mycount `1`   `2`   `3`   `4`   `5`   `6`   `7`   `8`   `9`   `10`  `11` 
        <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
    1      40 n     y     n     y     y     n     n     n     n     n     n    
    2     125 n     y     n     n     n     n     y     y     y     n     n    
    3      77 n     n     n     n     n     n     y     y     n     n     n    
    4      81 y     y     n     n     n     n     n     y     n     y     n    
    5     321 n     n     n     y     n     n     y     n     y     n     n    
    6      NA 81    246   0     361   40    0     523   283   446   81    0    
    # ... with 1 more variable: `12` <chr>
    
            [,1]
    mycount   NA
    1         81
    2        246
    3          0
    4        361
    5         40
    6          0
    7        523
    8        283
    9        446
    10        81
    11         0
    12       165