首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用rollapply计算每周的百分比变化

使用rollapply计算每周的百分比变化
EN

Stack Overflow用户
提问于 2020-11-30 11:20:29
回答 1查看 66关注 0票数 0

我有一些数据,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   date         col1   col2   col3
   <chr>       <dbl>  <dbl>  <dbl>
 1 2020_09_01 53542. 22133. 25295.
 2 2020_09_02 54157. 22505. 25327.
 3 2020_09_03 54137. 23115. 24993.
 4 2020_09_04 50795. 23127. 24166.
 5 2020_09_05 32829. 19600. 21860.

我正在尝试使用rollapply函数来计算7天的百分比变化-或者每周的百分比变化。我似乎不能让rollapply像我期望的那样工作。rollapply将每天计算与前一周相比的百分比变化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lagPeriod = 7
matrixCalcFunction <- function(x){
  (myData[[x]] - myData[[x - lagPeriod]]) / myData[[x - lagPeriod]]
}

myData %>%
  pivot_longer(cols = contains("col")) %>% 
  tidyquant::tq_mutate(
    select = value,
    mutate_fun = rollapply,
    width = lagPeriod ,
    align = "right",
    FUN = matrixCalcFunction
  )

预期输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   date         col1   col2   col3
   <chr>       <dbl>  <dbl>  <dbl>
 1 2020_09_01   NA     NA     NA    
 2 2020_09_02   NA     NA     NA   
 3 2020_09_03   NA     NA     NA   
 4 2020_09_04   NA     NA     NA   
 5 2020_09_05   NA     NA     NA   
 6 2020_09_06   NA     NA     NA   
 7 2020_09_07 -0.065  -0.055  -0.39
 8 2020_09_08 -0.058  -0.029  -0.041
 9 2020_09_09  0.068   0.071  0.039
10 2020_09_10  0.023  -0.0002 0.045

数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myData <- structure(list(date = c("2020_09_01", "2020_09_02", "2020_09_03", 
"2020_09_04", "2020_09_05", "2020_09_06", "2020_09_07", "2020_09_08", 
"2020_09_09", "2020_09_10", "2020_09_11", "2020_09_12", "2020_09_13", 
"2020_09_14", "2020_09_15", "2020_09_16", "2020_09_17", "2020_09_18", 
"2020_09_19", "2020_09_20", "2020_09_21", "2020_09_22", "2020_09_23", 
"2020_09_24", "2020_09_25", "2020_09_26", "2020_09_27", "2020_09_28", 
"2020_09_29", "2020_09_30"), col1 = c(53542.497, 54156.934, 54136.844, 
50794.971, 32828.797, 28475.082, 50083.573, 51017.288, 57819.908, 
51945.242, 27823.172, 34349.466, 28527.527, 54845.664, 56531.057, 
56556.415, 55396.121, 54303.732, 37513.441, 30041.867, 52397.815, 
55449.939, 56203.125, 53654.182, 53289.437, 38511.761, 28046.879, 
52132.573, 56055.611, 55520.683), col2 = c(22133.29, 22504.958, 
23115.242, 23126.773, 19599.718, 16752.282, 20920.38, 21844.255, 
24763.05, 23121.879, 17430.447, 20110.582, 18795.882, 24027.224, 
24890.61, 24408.889, 24363.402, 24582.204, 20146.731, 18376.923, 
23063.298, 24221.946, 25228.194, 24658.424, 23333.315, 20066.397, 
17504.372, 23561.362, 23456.284, 24101.302), col3 = c(25294.573, 
25326.797, 24992.764, 24166.084, 21859.885, 17549.005, 24306.496, 
24269.409, 25968.326, 25253.976, 17974.404, 22636.375, 20105.166, 
27000.274, 26291.22, 27277.371, 26851.75, 26133.317, 24055.107, 
19515.875, 25573.014, 31957.279, 28961.316, 26896.495, 26440.726, 
22941.927, 19990.825, 26595.878, 27725.468, 25965.802)), row.names = c(NA, 
-30L), class = c("tbl_df", "tbl", "data.frame"))

编辑:

这段代码可以运行,但我对diff(.x))/lag(.x, 7)感到有点困惑,也不确定它是否如我所愿,因为我得到了与预期输出不同的结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myData %>% 
  column_to_rownames("date") %>% 
  mutate(across(everything(),  ~ round(c(NA, diff(.x))/lag(.x, 7), 5), 
                names = "{col}_delta"))

对于单个观察(col1第1行和第7行),我可以使用类似diff(c(pull(myData[7, 2]), pull(myData[1, 2]))) = 3458.924的内容,然后我可以将其划分为:3458.924 / pull(myData[1, 2]) = 0.0646。因此,在diff函数中添加类似于diff(c(.x, lag(.x, 7)))的内容就可以得到结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-30 11:57:18

将其转换为zoo对象,然后使用diff提供一个zoo对象。可以使用fortify.zoo(x)将其转换回数据帧,其中x是diff的结果。或者,将其保留为zoo对象,这样您就可以使用zoo的其他功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(zoo)

z <- read.zoo(myData, format = "%Y_%m_%d")
diff(z, 6, arith = FALSE, na.pad = TRUE) - 1

要使用rollapply而不是最后一行,请使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rollapplyr(z, 7, function(x) x[7] / x[1] - 1, fill = NA)

或者使用lag.zoo:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
z / lag(z, -6, na.pad = TRUE) - 1

注意,dplyr阻塞了lag,所以要么确保它没有被加载,要么如果你需要它,就使用library(dplyr, exclude = c("filter", "lag"))加载它。

关于编辑,尝试这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(dplyr, exclude = c("lag", "filter"))
myData %>% mutate(across(-1, ~ . / dplyr::lag(., 6) - 1))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65072580

复制
相关文章
Github 多账号设置
登陆Github账号,参考下图,复制文件~/.ssh/id_rsa_blog01 内容用于配置SSH Keys。
Yorkyu
2022/03/22
4990
Github 多账号设置
git多账号配置
cd ~/.ssh ssk-keygen -t rsa -C "xiatian20010@126.com" (对应的邮箱) 提醒你设置存储名称 "/User/.ssh/id_rsa_github" 可以通过ls -al ~/.ssh查看生成的命令 查看对应 公钥 cat id_rsa_github.pub
公号sumsmile
2020/10/28
9210
git多账号配置
同机多Github账号配置多个SSH
Github配置路径: avatar(dropdown)->settings->SSH and GPG keys
CRPER
2022/03/08
2.7K0
同机多Github账号配置多个SSH
多 git 账号配置解决方案
相信很多开发者都会遇到在自己的电脑上使用不止一个 git 帐号的情况。一个一般是自己的 github 帐号,另一个则是公司的 git 帐号,比如 gitlab、bitbucket 等。如果采用 https 方式通信,那么 git 帐号间不会有冲突,但你在每次 pull、push 的时候都要输入帐号密码,十分繁琐。而且当代码库达到十分庞大的规模时,如果仍然采用 https 方式,在 git pull 时可能出现超时不响应的情况,此时只能采用 ssh 方式。ssh 在配置完 ssh key 后使用起来很方便,但是 git 帐号间可能出现冲突,这时候该如何解决呢?
逆葵
2019/04/25
1.5K0
问题随记 —— Git 多账号配置问题
自己在使用 Git 代码托管平台时,往往需要放到多个不同的托管平台里,Gitee、Github、GitCode 等等,不同的网站账号不同,需要生成的密钥也就不同,这里就可以通过配置多平台账号的方式来解决这个问题。
繁依Fanyi
2023/05/07
6170
问题随记 —— Git 多账号配置问题
Windows 中Git 多账号创建与提交
例如,我有一个公司git账号。zinyan@公司.com和一个私人账号 zinyan@私人.com
zinyan.com
2023/07/13
3560
Windows 中Git 多账号创建与提交
在windows上配置git支持多账号
现在大多数人都采用git进行版本管理,在git下面进行开发被越来越多的程序员所接受。还有越来越多的人参与开源社区的建设。现在有一个问题就是,在windows环境下,如何在git客户端上通过ssh key的方式配置多个账号。不需要输入git的用户名和密码,使得更加方便高效。
冬天里的懒猫
2022/09/08
1.7K0
在windows上配置git支持多账号
Git常用命令和多账号配置
团队合作开发中少不了版本控制管理工具,这里主要做对Git做一个总结。Git 是分布式的。 Git 的优势在于易于本地增加分支和分布式的特性,可离线提交。
Snine
2022/02/11
7980
Git常用命令和多账号配置
FinOps - 公有云多账号财务管理方案
集团型企业往往拥有多个云账号,并且这些账号可能隶属于不同的业务团队,财务人员需要管理多个云账号的财务关系:付款、开票、查看账单等。
iginkgo18
2023/07/20
4180
腾讯云弹性网卡绑定多IP利用外网访问教程
云主机配置 弹性网卡数 网卡绑定IP数 CPU: 1核 内存: 1G 2 2 CPU: 1核 内存: >1G 2 6 CPU: 2核 2 10 CPU: 4核 内存: < 16G 4 10 CPU: 4核 内存: > 16G 4 20 CPU: 8~12核 6 20 CPU: >12核 8 30 创建弹性网卡并将 IP 与其绑定 切换到购买所在地,点击新建,选择所属网络和所属子网,并分配内网IP: 不会的网上有很多实例 分配好IP 远程登录服务器进行设置 333333.png IP地址对应弹性网卡
用户3867577
2018/11/20
28.3K1
京豆薅羊毛升级版-支持多账号
之前写过京东自动签到的脚本京豆薅羊毛新姿势-docker方式,时隔近4个月了,有用过的小伙伴反馈需要支持多个账号自动签到,这不得赶紧安排上嘛,嘻嘻嘻...
卷福同学
2023/04/28
7410
京豆薅羊毛升级版-支持多账号
广播公司如何利用多CDN增加直播的弹性和性能
由于居家工作的限制和户外活动机会大大减少的原因,媒体公司和广播公司观察到直播视频的流量有了空前的增长,这也带来了新的挑战。
用户1324186
2022/05/25
8330
广播公司如何利用多CDN增加直播的弹性和性能
弹性盒
布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。
SingYi
2022/07/14
1.4K0
做弹性的云—腾讯云弹性伸缩
腾讯云开发者社区
2017/04/18
9.9K0
基础架构中的弹性意义,评估弹性水平以及实现弹性的方法
在基础架构的设计和运维中,弹性是非常重要的一个概念。弹性的主要意义是指系统的可恢复性和容错性,即当系统出现故障或负载变化时,系统能够自动调整来适应变化,保持正常运行。弹性能够提高系统的可用性和稳定性,减少系统崩溃和业务中断的风险。
一凡sir
2023/08/10
4040
CSS——弹性盒
弹性盒(Flexible Box,简称Flexbox)属性是一些与弹性盒子布局相关的CSS属性。
Html5知典
2019/11/26
1.5K0
多微信公共账号同时接入微信公共平台API(PHP)
支持多微信公共账号同时接入的微信公共账号第三方平台框架 应用案例: http://zixie.sinaapp.com demo路径: http://microdemo.sinaapp.com/WechatAPI/ 线上代码结构与本地一致,可以追加完整的路径测试效果 代码结构: — app:具体微信公共账号业务逻辑层 - app.do.php:公共账号逻辑处理的基类 - app.test.conf.php:对于appDo的测试用例 - app.test.php:对于appDo的测试入口地址
子勰
2018/05/22
1.5K0
Web应用多账号系统设计及微信扫码登录实现
用户1170933
2018/01/05
3.1K0
Web应用多账号系统设计及微信扫码登录实现
弹性和容错
弹性和容错是微服务架构中非常重要的两个方面,它们能够保证系统在面对各种异常和故障时仍能正常运行,并且能够快速恢复正常状态。在本文中,我们将详细介绍弹性和容错的概念、原理和实现方式。
堕落飞鸟
2023/04/08
9300
Flex弹性布局
取值:row(默认) | row-reverse | column | column-reverse
ymktchic
2022/01/18
1.5K0
Flex弹性布局

相似问题

appengine短信验证:多账号?

13

多账号导入已有资源

11

android上多账号的处理

11

将弹性ip与其他账号的实例关联

34

如何实现Google多账号登录?

14
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文