对 R 中的多个向量使用 tapply 和 cumsum 函数
Using tapply and cumsum function for multiple vectors in R
我有一个包含四列的数据框。
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、日期?
如果有多个组,将其包装在 list
中,但请注意 tapply
在汇总函数中,当我们指定 cumsum
之类的函数时,它可以拆分.
tapply(date_country$n, list(date_country$country, date_country$pangolin_lineage), cumsum))
但是,使用 ave
更容易,即如果我们想创建一个新列,只需使用 ave
[=18 就可以避免 unlist
等的麻烦=]
ave(date_country$n, date_country$country,
date_country$pangolin_lineage, FUN = cumsum)
#[1] 1 2 3 1 4 1
我有一个包含四列的数据框。
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、日期?
如果有多个组,将其包装在 list
中,但请注意 tapply
在汇总函数中,当我们指定 cumsum
之类的函数时,它可以拆分.
tapply(date_country$n, list(date_country$country, date_country$pangolin_lineage), cumsum))
但是,使用 ave
更容易,即如果我们想创建一个新列,只需使用 ave
[=18 就可以避免 unlist
等的麻烦=]
ave(date_country$n, date_country$country,
date_country$pangolin_lineage, FUN = cumsum)
#[1] 1 2 3 1 4 1