R中具有相似名称的变量的累积和
我想我知道你想要什么。下面是一个data.table方法R中具有相似名称的变量的累积和,r,dplyr,cumulative-sum,R,Dplyr,Cumulative Sum,我想我知道你想要什么。下面是一个data.table方法 df_test %>% group_by(YEAR,MONTH_NUM) %>% summarize(Sys_sum=sum(Sys_Indicator),lbl_Sum=sum(lbl_Indicator),Pk_Sum=sum(Pk_Indicator)) %>% arrange(MONTH_NUM,YEAR) %>% ungroup() %>% mutate(Sys_cum=c
df_test %>%
group_by(YEAR,MONTH_NUM) %>%
summarize(Sys_sum=sum(Sys_Indicator),lbl_Sum=sum(lbl_Indicator),Pk_Sum=sum(Pk_Indicator)) %>%
arrange(MONTH_NUM,YEAR) %>%
ungroup() %>%
mutate(Sys_cum=cumsum(Sys_sum),Cum_lbl=cumsum(lbl_Sum),Pk_sum=cumsum(Pk_Sum))
我想我知道你想要什么。下面是一个data.table方法
df_test %>%
group_by(YEAR,MONTH_NUM) %>%
summarize(Sys_sum=sum(Sys_Indicator),lbl_Sum=sum(lbl_Indicator),Pk_Sum=sum(Pk_Indicator)) %>%
arrange(MONTH_NUM,YEAR) %>%
ungroup() %>%
mutate(Sys_cum=cumsum(Sys_sum),Cum_lbl=cumsum(lbl_Sum),Pk_sum=cumsum(Pk_Sum))
您可以使用
dplyr
中的\u at
变体将其应用于多列:
library(data.table)
setDT(df_test)[ ,sapply(names(df_test)[grep("Indicator",names(df_test))],paste0,"_cumsum") := lapply(.SD[,grep("Indicator",names(df_test))],cumsum)]
df_test
MONTH_NUM YEAR Sys_Indicator lbl_Indicator Pk_Indicator Sys_Indicator_cumsum lbl_Indicator_cumsum Pk_Indicator_cumsum
1: 7 2018 1 1 1 1 1 1
2: 7 2018 0 1 0 1 2 1
3: 8 2018 0 1 1 1 3 2
4: 8 2018 1 1 1 2 4 3
5: 8 2019 0 0 0 2 4 3
6: 10 2019 0 1 1 2 5 4
7: 11 2019 0 0 0 2 5 4
8: 12 2019 0 0 0 2 5 4
9: 1 2019 1 1 1 3 6 5
10: 2 2018 1 1 1 4 7 6
11: 3 2018 0 0 0 4 7 6
12: 4 2019 1 1 1 5 8 7
13: 4 2018 0 1 0 5 9 7
14: 5 2018 1 1 0 6 10 7
15: 5 2018 1 1 0 7 11 7
16: 5 2018 1 1 0 8 12 7
17: 5 2018 1 1 1 9 13 8
18: NA NA 1 0 1 10 13 9
库(dplyr)
df_测试%>%
安排(月、年)%>%
分组依据(年、月数)%>%
汇总在(变量(以('Indicator')结尾),总和%>%
解组()%>%
在(变量(以('Indicator')结尾)、列表(cs=~cumsum())中进行变异
#年月数系统指示器lbl指示器Pk指示器系统指示器lbl指示器Pk指示器
#
# 1 2018 2 1 1 1 1 1 1
# 2 2018 3 0 0 0 1 1 1
# 3 2018 4 0 1 0 1 2 1
# 4 2018 5 4 4 1 5 6 2
# 5 2018 7 1 2 1 6 8 3
# 6 2018 8 1 2 2 7 10 5
# 7 2019 1 1 1 1 8 11 6
# 8 2019 4 1 1 1 9 12 7
# 9 2019 8 0 0 0 9 12 7
#10 2019 10 0 1 1 9 13 8
#11 2019 11 0 0 0 9 13 8
#12 2019 12 0 0 0 9 13 8
#13 NA 10 10 13 9
您可以使用dplyr
中的\u at
变体将其应用于多列:
library(data.table)
setDT(df_test)[ ,sapply(names(df_test)[grep("Indicator",names(df_test))],paste0,"_cumsum") := lapply(.SD[,grep("Indicator",names(df_test))],cumsum)]
df_test
MONTH_NUM YEAR Sys_Indicator lbl_Indicator Pk_Indicator Sys_Indicator_cumsum lbl_Indicator_cumsum Pk_Indicator_cumsum
1: 7 2018 1 1 1 1 1 1
2: 7 2018 0 1 0 1 2 1
3: 8 2018 0 1 1 1 3 2
4: 8 2018 1 1 1 2 4 3
5: 8 2019 0 0 0 2 4 3
6: 10 2019 0 1 1 2 5 4
7: 11 2019 0 0 0 2 5 4
8: 12 2019 0 0 0 2 5 4
9: 1 2019 1 1 1 3 6 5
10: 2 2018 1 1 1 4 7 6
11: 3 2018 0 0 0 4 7 6
12: 4 2019 1 1 1 5 8 7
13: 4 2018 0 1 0 5 9 7
14: 5 2018 1 1 0 6 10 7
15: 5 2018 1 1 0 7 11 7
16: 5 2018 1 1 0 8 12 7
17: 5 2018 1 1 1 9 13 8
18: NA NA 1 0 1 10 13 9
库(dplyr)
df_测试%>%
安排(月、年)%>%
分组依据(年、月数)%>%
汇总在(变量(以('Indicator')结尾),总和%>%
解组()%>%
在(变量(以('Indicator')结尾)、列表(cs=~cumsum())中进行变异
#年月数系统指示器lbl指示器Pk指示器系统指示器lbl指示器Pk指示器
#
# 1 2018 2 1 1 1 1 1 1
# 2 2018 3 0 0 0 1 1 1
# 3 2018 4 0 1 0 1 2 1
# 4 2018 5 4 4 1 5 6 2
# 5 2018 7 1 2 1 6 8 3
# 6 2018 8 1 2 2 7 10 5
# 7 2019 1 1 1 1 8 11 6
# 8 2019 4 1 1 1 9 12 7
# 9 2019 8 0 0 0 9 12 7
#10 2019 10 0 1 1 9 13 8
#11 2019 11 0 0 0 9 13 8
#12 2019 12 0 0 0 9 13 8
#13 NA 10 10 13 9
这很有效,谢谢!一个简单的问题,我怎样才能将cumsum列添加到原始数据中,而不是使用这个摘要视图?我还想包括结尾带有“binary”的变量。我可以用('Indicator | binary')做一个简单的ends_吗?@Mel您可以使用mutate_at
而不是summary_at
来保持相同的行数,但它不会给出相同的cumsum
值,因为现在我们有了更多的行。要包含多个这样的模式,我们可以使用匹配
这样的mutate_at(vars(matches('Indicator$binary$))、list(cs=~cumsum(.))
。那么,使用dplyr是否无法获得每行数据的总和?你所说的每行的cumsum
是什么意思?这很有效,谢谢!一个简单的问题,我怎样才能将cumsum列添加到原始数据中,而不是使用这个摘要视图?我还想包括结尾带有“binary”的变量。我可以用('Indicator | binary')做一个简单的ends_吗?@Mel您可以使用mutate_at
而不是summary_at
来保持相同的行数,但它不会给出相同的cumsum
值,因为现在我们有了更多的行。为了包含多个这样的模式,我们可以使用匹配
这样的mutate_at(vars(matches('Indicator$binary$))、list(cs=~cumsum(.))
。那么,是否无法使用dplyr获取每行数据的cumsum?你说的每行的cumsum
是什么意思?谢谢伊恩!这也行得通,有没有办法把cumsum换成一年一个月的?谢谢你,伊恩!这也是可行的,有没有办法在一个月和一年中去掉cumsum?