【问题标题】:rowsum based on groupings or conditions in rrowsum 基于 r 中的分组或条件
【发布时间】:2018-12-20 15:55:51
【问题描述】:

我想根据列名在 中执行

我有 50 多个专栏,并查看了各种解决方案,包括 this

但是,这并不能真正回答我的问题。我有列名,例如: total_2012Q1, total_2012Q2, total_2012Q3, total_2012Q4 ,..., 直到 total_2014Q4 和其他字符变量。我想按年份添加行,所以最后,我会有三年的列:total_2012, total_2013, total_2014

我不想 并选择类似 ..sample[,2:5] 的内容。有没有一种方法可以在不手动查看列号的情况下对它们求和?另外, 是一个选项,但是如果还有字符变量,你如何只处理你想要总结的 int 变量?

简单的可重现示例(前):

id total_2012Q1 total_2012Q2 total_2013Q1 total_2013Q2 char1 char2
 1         1231         5455         1534         2436    N     Y
 2         3948         1239          223          994    Y     N

可重现的示例(帖子):

id total_2012 total_2013 char1 char2
 1       6686      3970     N     Y
 2       5187      1217     Y     N

感谢您的任何建议。

【问题讨论】:

  • 人们更容易通过reproducible example 提供帮助。这包括您尝试过但需要帮助调试的代码、具有代表性的数据样本以及您尝试获得的输出
  • 谢谢@camille。我已经编辑了一个简单的例子。

标签: rowsum r rowsum split.default r grouping conditional-statements rowsum


【解决方案1】:

你可以使用split.default,即

sapply(split.default(df, sub('^.*_([0-9]+)Q[0-9]', '\\1', names(df))), rowSums)
#     2012 2013
#[1,]    3   23
#[2,]    7   37
#[3,]    9   49

数据:

dput(df)
structure(list(total_2012Q1 = c(1, 2, 3), total_2012Q2 = c(2, 
5, 6), total_2013Q1 = c(12, 15, 16), total_2013Q2 = c(11, 22, 
33)), class = "data.frame", row.names = c(NA, -3L))

【讨论】:

    【解决方案2】:

    我使用tidyverse 函数处理此问题的方法是将数据重新整形为长格式,这样您就有了total_2012Q1total_2012Q2 等列。然后您可以将其分成年份和季度,其中四分之一被标记为每个字符串中的最后两个字符:

    library(dplyr)
    library(tidyr)
    
    df %>%
      gather(key, value, starts_with("total")) %>%
      separate(key, into = c("year", "quarter"), sep = -2)
    #> # A tibble: 8 x 6
    #>      id char1 char2 year       quarter value
    #>   <dbl> <chr> <chr> <chr>      <chr>   <dbl>
    #> 1     1 N     Y     total_2012 Q1       1231
    #> 2     2 Y     N     total_2012 Q1       3948
    #> 3     1 N     Y     total_2012 Q2       5455
    #> 4     2 Y     N     total_2012 Q2       1239
    #> 5     1 N     Y     total_2013 Q1       1534
    #> 6     2 Y     N     total_2013 Q1        223
    #> 7     1 N     Y     total_2013 Q2       2436
    #> 8     2 Y     N     total_2013 Q2        994
    

    之后,您可以按标识符和年份进行分组,汇总这些值,然后将其重新调整为宽格式。

    df %>%
      gather(key, value, starts_with("total")) %>%
      separate(key, into = c("year", "quarter"), sep = -2) %>%
      group_by_at(vars(id:year)) %>%
      summarise(value = sum(value)) %>%
      spread(key = year, value = value)
    #> # A tibble: 2 x 5
    #> # Groups:   id, char1, char2 [2]
    #>      id char1 char2 total_2012 total_2013
    #>   <dbl> <chr> <chr>      <dbl>      <dbl>
    #> 1     1 N     Y           6686       3970
    #> 2     2 Y     N           5187       1217
    

    这样的方法,尤其是使用 starts_with("total") 而不是硬编码的列名或列位置进行收集,可以让您扩展到包含更多列的更大数据集。

    【讨论】:

      猜你喜欢
      • 2019-11-21
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2021-06-09
      • 1970-01-01
      相关资源
      最近更新 更多