dt <- data.table(x=c(1, .9, .8, .75, .5, .1))
dt
x
1: 1.00
2: 0.90
3: 0.80
4: 0.75
5: 0.50
6: 0.10
Run Code Online (Sandbox Code Playgroud)
对于每一行,如何获取该行和接下来两行的x乘积?
x Prod.3
1: 1.00 0.7200
2: 0.90 0.5400
3: 0.80 0.3000
4: 0.75 0.0375
5: 0.50 NA
6: 0.10 NA
Run Code Online (Sandbox Code Playgroud)
更一般地说,对于每一行,如何获得该行和接下来的n行的x乘积?
我经常使用大型 3D 数组(纬度、经度和时间),例如 720x1440x480 的大小。通常,我需要对每个纬度和经度随时间进行操作,例如,获取平均值(导致 2D 数组)或及时获取滚动平均值(导致 3D 数组),或更复杂的函数。
我的问题是:哪种包装(或方式)最有效和最快?
我知道一个选项是基础 R,使用 apply 函数和滚动函数与提供 rollapply 函数的包 zoo 混合。另一种方式是使用 tidyverse,另一种方式是使用 data.table。以及这些包之间的组合。但有没有最快的?
例如,如果我有这个数据立方体:
data <- array(rnorm(721*1440*480),dim = c(721,1440,480))
Run Code Online (Sandbox Code Playgroud)
哪些维度是纬度、经度和时间,如下所示:
lat <- seq(from = -90, to = 90, by = 0.25)
lon <- seq(from = 0, to = 359.75, by = 0.25)
time <- seq(from = as.Date('1980-01-01'), by = 'month', length.out = 480)
Run Code Online (Sandbox Code Playgroud)
我通常需要做这样的事情(这是在基础 R + 动物园):
# Average in time
average_data <- apply(data, 1:2, mean)
# Rolling mean, width of window = …
Run Code Online (Sandbox Code Playgroud) 是否存在使用data.table分组计算滚动统计信息的现有习惯用法?
例如,给出以下代码:
DT = data.table(x=rep(c("a","b","c"),each=2), y=c(1,3), v=1:6)
setkey(DT, y)
stat.ror <- DT[,rollapply(v, width=1, by=1, mean, na.rm=TRUE), by=y];
Run Code Online (Sandbox Code Playgroud)
如果还没有,那最好的方法是什么?
假设我在dataframe / data.table中有两列,一列是级别,另一列是音量。我想计算按音量加权的级别的滚动平均值,因此对于某些滚动窗口,体积充当权重(归一化为1)。
基数R具有weighted.mean()函数,该函数对两个静态向量进行类似的计算。我尝试使用sapply将list / vector fo参数传递给它,并创建了rollign系列,但无济于事。
我应该与weighted.mean()一起使用哪种“应用”机制才能获得所需的结果,否则我将不得不循环/编写自己的函数?
///////////////////////////////////////////////////// ///////////////////////////////////////
最后,我决定编写简单的自定义函数,该函数利用了出色的RccpRoll软件包。我发现RccpRoll速度快,比其他滚动方法快得多,这对我来说很重要,因为我的数据有几百万行。
该函数的代码如下所示(由于RccpRoll返回不带NA的数据,因此我在开头增加了一些NA):
require(RcppRoll)
my.rollmean.weighted <- function(vec1,vec2,width){
return(c(rep(NA,width-1),roll_sum(vec1*vec2,width)/roll_sum(vec2,width)))
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找构建移动平均线,同时在两个分类变量上聚合时间序列数据集.虽然我已经看过其他一些教程,但它们似乎都没有捕捉到我想要实现的特定任务.
我的原始数据集(df
)包含每个个体(id
)的行,用于一系列日期,范围从0到180(Days
).个人可以是两个数据子集之一的成员(Group
).
然后我汇总这个数据框以获得两组的每日均值.
library(plyr)
summary <- ddply(df, .(Group,Days), summarise,
DV = mean(variable), resp=length(unique(Id)))
Run Code Online (Sandbox Code Playgroud)
然而,下一步是在两组内构建移动平均线.在下面的示例数据框中,我刚刚使用前5天构建了一个5天的平均值.
Group Days DV 5DayMA
exceeded 0 2859
exceeded 1 2948
exceeded 2 4412
exceeded 3 5074
exceeded 4 5098 4078
exceeded 5 5147 4536
exceeded 6 4459 4838
exceeded 7 4730 4902
exceeded 8 4643 4815
exceeded 9 4698 4735
exceeded 10 4818 4670
exceeded 11 4521 4682
othergroup 0 2859
othergroup 1 2948 …
Run Code Online (Sandbox Code Playgroud) 我的目标:我每5行计算一次xts列的曲线下面积.
我的目标:我想知道R中是否有一个函数可以更快地(向量化它)而不是从myxts5的列中生成一个向量然后循环计算.
谢谢你的帮助.
我已经包含了我的代码,输出和数据集:
#create an xts object
library(xts)
myxts5<-xts(dat5[,2:7],order.by=as.POSIXct(dat5[,1]))
colnames(myxts5)<-c("Open","High","Low","Close","Volume","RSI_10")
#make the data reproducible
dput(myxts5,file='so4.txt')
#my method to calculate the entire area under the RSI
library(MESS)
y1<-as.vector(myxts5[11:nrow(myxts5),"RSI_10"]) #remove the first 10 NAs
x1<-1:length(y1)
AUC_RSI10<-NA
for(i in 1:(length(y1)-4))
{
AUC_RSI10[i]<-auc(x1,y1,from=i,to=i+4,type="spline")
}
#output the result
dput(AUC_RSI10,file='so5.txt')
Run Code Online (Sandbox Code Playgroud)
这是我的输出:
c(212.42031469304, 212.798819901101, 209.986805467201, 204.085562604063,
197.984367949833, 190.26277666882, 186.077746687353, 175.748595915665,
153.079882459862, 130.009179454897, 102.067828644029, 93.1546072252816,
106.253169598421, 126.695279601823, 156.84779427326, 171.19433284721,
177.724612560769, 176.407343545939, 180.185730377015, 185.540559407078,
181.492038514392, 189.691635230233, 184.490969841544, 188.753967108042,
207.705900307578, 214.048826298562, 218.30216750124, 212.29968278624,
199.551248663318, 188.776300102749, 182.52612752936, 181.256931078184,
186.756042540598, 192.301043062924, …
Run Code Online (Sandbox Code Playgroud)