我正在努力解决以下问题.
如果有一个(大)数据框,则具有以下内容:
我想确保对于每个时间间隔的每个唯一ID,数据框中都有一个度量.如果不是,我想为该时间/ ID添加0(或NA)度量.
要说明问题,请创建以下test
数据框:
test <- data.frame(
YearWeek =rep(c("2012-01","2012-02"),each=4),
ProductID =rep(c(1,2), times=4),
CustomerID =rep(c("a","b"), each=2, times=2),
Quantity =5:12
)[1:7,]
YearWeek ProductID CustomerID Quantity
1 2012-01 1 a 5
2 2012-01 2 a 6
3 2012-01 1 b 7
4 2012-01 2 b 8
5 2012-02 1 a 9
6 2012-02 2 a 10
7 2012-02 1 b 11
Run Code Online (Sandbox Code Playgroud)
第8行是故意遗漏的.这样,我为ID'2 Quantity
-b'(ProductID-CustomerID
)模拟时间值"2012-02" 的"缺失值"(缺失).
我想做的是调整data.frame,使所有时间值(这些都是已知的,在本例中只是"2012-01"和"2012-02"),对于所有ID组合(这些是事先不知道,但这是'数据框中的所有唯一ID组合',因此ID列上的唯一集合),数据框中有数量.
这应该是这个例子的结果(如果我们选择NA
缺失值,通常我想控制它):
YearWeek ProductID CustomerID Quantity
1 2012-01 …
Run Code Online (Sandbox Code Playgroud) 可能重复:
如何使用特定变量名保存()
我想知道一个简单的方法是使用一个objectName
带有要保存的对象名称的变量来保存R 中的对象.我希望这可以轻松保存对象,其名称在文件名中.
我试图使用get
,但我没有设法用它的原始对象名称保存对象.
例:
如果我有一个名为"temp"的对象,我想将其保存在"dataDir"目录中.我将对象的名称放在变量"objectName"中.
尝试1:
objectName<-"temp"
save(get(objectName), file=paste(dataDir, objectName, ".RData", sep=""))
load(paste(dataDir, objectName, ".RData", sep=""))
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为R试图保存一个被调用的对象get(objectName)
,而不是这个调用的结果.所以我尝试了以下方法:
尝试2:
objectName<-"temp"
object<-get(objectName)
save(object, file=paste(dataDir, objectName, ".RData", sep=""))
load(paste(dataDir, objectName, ".RData", sep=""))
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,因为R保存名为"object"的对象,而不是名称"temp".加载后我有一个"对象"的副本,而不是"临时".(是的,内容相同......但这不是我想要的:)).所以我认为它应该是指针.所以尝试了以下内容:
尝试3:
objectName<-"temp"
object<<-get(objectName)
save(object, file=paste(dataDir, objectName, ".RData", sep=""))
load(paste(dataDir, objectName, ".RData", sep=""))
Run Code Online (Sandbox Code Playgroud)
与尝试2相同的结果.但我不确定我在做我认为我正在做的事情.
这是什么解决方案?
我正在使用包中的accuracy
函数forecast
来计算准确度度量.我用它来计算拟合时间序列模型的度量,例如ARIMA或指数平滑.由于我在不同维度和聚合级别上测试不同的模型类型,我使用的是MUND,即Hyndman等人(2006年,"另一种预测准确度测量")引入的绝对缩放误差,来比较不同的模型在不同的层面上.
现在我也将模型与预测历史进行比较.因为我只有预测值而不是模型,所以我尝试使用该accuracy
函数.在函数描述中提到它还允许提供两个向量参数,一个具有预测值,一个具有实际值,以计算度量(而不是拟合模型):
f:类"预测"的对象,或包含预测的数字向量.如果省略x,它也将与Arima,ets和lm对象一起使用 - 在这种情况下,返回样本内准确度度量.
x:可选的数字向量,包含与对象长度相同的实际值.
但我很惊讶所有措施都归还了,期待MASE.所以我想知道是否有人知道原因是什么?为什么MASE没有返回,而在accuracy
函数中使用两个向量作为参数?
我有一个带#
符号作为分隔符的数据文件,我想用read.file
命令读取.
首先; 它是一个大数据文件,我不想更改分隔符,因为:
#
符号都是分隔符,所以每次我想再次读取这些文件时,我都不想更改数据文件所以我假设我可以使用命令的sep
参数read.file
.但#
正如我所预料的那样,它并没有成功.只读取第一列.我尝试了一些不同的分隔符,除了#
标志外,一切正常.请参阅下面的一些示例,包括#
分隔符.
该文件看起来像:
H1#H2#H3
a#b#c
d#e#f
Run Code Online (Sandbox Code Playgroud)
R中的代码执行包括结果,对于我更改分隔符的同一文件.对于=
,|
,@
以及$
它工作得很好,但不适合#
...
> read.table(file='test_data.dat', check.names=F, sep='=', header=T)
H1 H2 H3
1 a b c
2 d e f
> read.table(file='test_data.dat', check.names=F, sep='|', header=T)
H1 H2 H3
1 a b c
2 d e f
> read.table(file='test_data.dat', check.names=F, sep='@', header=T)
H1 H2 H3
1 a b …
Run Code Online (Sandbox Code Playgroud) 我在一组庞大的时间序列上使用了一个大的(isplit)循环来测试ARIMA模型.为此,我正在使用包中的auto.arima
功能forecast
.
为此,我创建了一个函数,遍历所有时间序列,同时跟踪进度并存储拟合的模型和统计数据(如精度和模型参数).现在我正在处理auto.arima
函数生成的错误.更确切地说; 由OCSB季节性测试引起的.
我将此功能用于"月度"时间序列以及"每周"时间序列.对于月度时间序列,a没有问题(几乎50000,包括很多'零'值).随着每周的时间序列我遇到了问题.但我无法找到错误的真正原因.
我试图重新创建错误.我认为它与很多0(或相同)值结合52频率周期有关.但我仍然无法指出这个问题.
请参阅以下示例.一些信息:时间序列集是每周值(freq = 52),从2010年开始,第1周.长度为122个样本(直到2012年,第18周).因此我测试了长度为122,为此我可以生成错误.我仍然认为这与频率和'运行相同的值'有关...
对于某些人来说,会产生错误,有些人则没有.
例1 [随机数,长度= 122]>没问题:
ts_element <- ts(sample(0:30, 122, replace=TRUE), frequency = 52, start = c(2010, 1))
fit <- auto.arima(ts_element, trace=FALSE, seasonal.test="ocsb", allowdrift=TRUE, stepwise=TRUE)
Run Code Online (Sandbox Code Playgroud)
示例2 [仅0值,长度= 122]> OCSB测试错误(通常我会假设一个不同的错误...参见示例3):
ts_element <- ts(sample(0:0, 122, replace=TRUE), frequency = 52, start = c(2010, 1))
fit <- auto.arima(ts_element, trace=FALSE, seasonal.test="ocsb", allowdrift=TRUE, stepwise=TRUE)
Error in OCSBtest(x, m) : subscript out of bounds
Run Code Online (Sandbox Code Playgroud)
示例3 [仅0值,长度= 100]>'零/相等值'错误,我假设这一个,这个例子不是问题,而是指出长度是相关的(与例2比较):
ts_element <- ts(sample(0:0, 100, replace=TRUE), frequency = 52, …
Run Code Online (Sandbox Code Playgroud) 我有一个大data.frame
(1.9M记录,20列).其中一列是因子列,其值为不同长度的数字(不同的字符/数字,例如567839,234324324,3243211等)注意:这些是数字代码,没有实际值,也可能只是不同的字符这个例子的长度.
现在我想将因子转换为13位数因子,以便在数字位数小于13的情况下,因子得到前导零.
例:
Old factor Length New factor
432543532532 12 0432543532532
3285087250932 13 3285087250932
464577534 9 0000464577534
2225324324324 13 2225324324324
864235325264 12 0864235325264
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的方法,但现在我卡住了.问题在于整个数据集中因子的长度不同.
我试着用一个例子来尝试以下内容.
data.frame
使用我执行代码的三个不同列创建,以识别问题.
> df.test <- as.data.frame(cbind(c("432543532532", "3285087250932", "464577534", "2225324324324", "864235325264"), c("3285087250932", "132543532532", "464577534", "2225324324324", "864235325264"), c("164577534", "3285087250932", "432543532532", "2225324324324", "864235325264")))
> df.test
V1 V2 V3
1 432543532532 3285087250932 164577534
2 3285087250932 132543532532 3285087250932
3 464577534 464577534 432543532532
4 2225324324324 2225324324324 2225324324324
5 864235325264 864235325264 864235325264
> levels(df.test$V1) <- paste(substr("0000000000000", 0, 13 - nchar(as.character(levels(df.test$V1)))), …
Run Code Online (Sandbox Code Playgroud)