【问题标题】:Using tapply and cumsum function for multiple vectors in R对R中的多个向量使用tapply和cumsum函数
【发布时间】:2021-06-02 07:08:57
【问题描述】:

我有一个包含四列的数据框。

  country       date       pangolin_lineage       n      cum_country
1 Albania    2020-09-05      B.1.236              1           1
2 Algeria    2020-03-02      B.1                  2           2
3 Algeria    2020-03-08      B.1                  1           3
4 Algeria    2020-06-09      B.1.1.119            1           4
5 Algeria    2020-06-15      B.1                  1           5
6 Algeria    2020-06-15      B.1.36               1           6

我希望计算跨国家和日期的 n 的累积和。我可以用这段代码做到这一点:

date_country$cum_country <- as.numeric(unlist(tapply(date_country$n, date_country$country, cumsum)))

然而,我现在想做同样的事情,但是跨国家、pangolin_lineage 和日期的累积总和。我曾尝试在上述函数中添加另一个向量,但您似乎只能为 tapply 输入一个索引输入和一个向量输入。我收到此错误:

date_country$cum_country_pangol <- as.numeric(unlist(tapply(date_country$n, date_country$country, date_country$pangolin_lineage, cumsum)))
Error in match.fun(FUN) : 
  'date_country$pangolin_lineage' is not a function, character or symbol

有没有人知道如何在多个向量(国家、pangolin_lineage、日期)中使用 cumsum?

【问题讨论】:

    标签: r cumulative-sum tapply


    【解决方案1】:

    如果有多个组,则将其包装在list 中,但请注意tapply 在汇总函数中,当我们指定像cumsum 这样的函数时,它可以拆分。

     tapply(date_country$n, list(date_country$country, date_country$pangolin_lineage), cumsum))
    

    但是,使用ave 会更容易,即如果我们想创建一个新列,只需使用ave 就可以避免unlist 等的麻烦

    ave(date_country$n, date_country$country, 
         date_country$pangolin_lineage, FUN = cumsum)
    #[1] 1 2 3 1 4 1
    

    【讨论】:

    • 太棒了!太感谢了。 ave() 完美运行
    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多