使用 xts 对象本身的变量子集 xts 对象
Subset xts object using variables for xts object itself
我有 2 个数据系列,即 'usagexts' 和 'tempxts'。我想为 2 个对象中的每一个创建 3 个子集。我能够为每个系列单独循环使用开始和结束期间的变量来遍历日期参数。没问题。但是,我也想对 2 系列的名称做同样的循环。
换句话说,xts对象名也需要来自变量。
这就是我尝试过的 - 一个具有硬编码系列名称的开始日期和结束日期变量名称有效,但另一个具有系列名称变量名称以及开始和结束日期的变量名称不喜欢这样:
此代码有效:
varcount <- 2
usagextsobjects <- vector((varcount * nrow(sum_datesdf)), mode = "list")
for (i in 1:varcount)
{for (j in 1:nrow(sum_datesdf))
{if (i == 1)
{usagextsobjects[[(((i - 1) * nrow(sum_datesdf)) + j)]] <- usagexts[paste(sum_datesdf$startperioddate[j], sum_datesdf$endperioddate[j], sep = "/")]
}
else
{usagextsobjects[[(((i - 1) * nrow(sum_datesdf)) + j)]] <- tempxts[paste(sum_datesdf$startperioddate[j], sum_datesdf$endperioddate[j], sep = "/")]
}
}
}
这不是 :
for (i in 1:varcount)
{for (j in 1:nrow(sum_datesdf))
{if (i == 1)
{modelformulae <- paste0(paste(paste0(sum_datesdf$var1[i], "xts[", sum_datesdf$startperioddate[j]), sum_datesdf$endperioddate[j], sep = "/"),"]")
}
else
{modelformulae <- paste0(paste(paste0(sum_datesdf$var2[i], "xts[", sum_datesdf$startperioddate[j]), sum_datesdf$endperioddate[j], sep = "/"),"]")
}
usagextsobjects[[(((i - 1) * nrow(sum_datesdf)) + j)]] <- as.formula(modelformulae)
}
}
i==1的变量modelformulae内容如下:usagexts[2015-10-01/2016-03-31]
。但这并不能转化为创建相关的 xts 对象
sum_datesdf数据框是这样的:
startperioddate,endperioddate,checkval,var1,var1_1,var2,var2_1,varname1,varname1_1,varname2,varname2_1
1,2015-10-01,2016-03-31,1,usage,dusage,temp,dtemp,usage_1510_1603,dusage_1510_1603,temp_1510_1603,dtemp_1510_1603
6,2016-10-01,2017-03-31,1,usage,dusage,temp,dtemp,usage_1610_1703,dusage_1610_1703,temp_1610_1703,dtemp_1610_1703
11,2017-10-01,2018-03-31,1,usage,dusage,temp,dtemp,usage_1710_1803,dusage_1710_1803,temp_1710_1803,dtemp_1710_1803
我期望对象 'usagextsobjects' 包含 6 个 xts 对象的列表。使用第一个代码可以,但使用第二个代码则不行。
错误是这样说的:
Error in [.xts
(usagexts, 2015 - 10 - 1/2016 - 3 - 31) :
subscript out of bounds
通常,要通过字符串引用命名对象,您需要使用 get()
而不仅仅是您尝试使用 paste
调用的字符串本身。而且您不是根据需要 as.formula
的字符串构建公式对象,因此请删除该调用。请参阅下面的调整:
for (i in 1:varcount)
{for (j in 1:nrow(sum_datesdf))
{if (i == 1)
{ data <- get(sum_datesdf$var1[i])[paste(sum_datesdf$startperioddate[j], sum_datesdf$endperioddate[j], sep = "/")]
}
else
{ data <- get(sum_datesdf$var2[i])[paste(sum_datesdf$startperioddate[j], sum_datesdf$endperioddate[j], sep = "/")]
}
usagextsobjects[[(((i - 1) * nrow(sum_datesdf)) + j)]] <- data
}
}
但是,请考虑使用 Map
(mapply
的包装器)按元素遍历 sum_datesdf 列并构建所需的列表,而不是通过嵌套的 for
循环初始化和分配。此外,分成两个 Map
调用与 c()
绑定在一起用于单个列表:
get_data <- function(obj, start, end) {
get(obj)[paste(start, end, sep = "/")]
}
usagextsobjects <- with(sum_datesdf,
c(Map(get_data, var1, startperioddate, endperioddate),
Map(get_data, var2, startperioddate, endperioddate)
)
)
我有 2 个数据系列,即 'usagexts' 和 'tempxts'。我想为 2 个对象中的每一个创建 3 个子集。我能够为每个系列单独循环使用开始和结束期间的变量来遍历日期参数。没问题。但是,我也想对 2 系列的名称做同样的循环。
换句话说,xts对象名也需要来自变量。
这就是我尝试过的 - 一个具有硬编码系列名称的开始日期和结束日期变量名称有效,但另一个具有系列名称变量名称以及开始和结束日期的变量名称不喜欢这样:
此代码有效:
varcount <- 2
usagextsobjects <- vector((varcount * nrow(sum_datesdf)), mode = "list")
for (i in 1:varcount)
{for (j in 1:nrow(sum_datesdf))
{if (i == 1)
{usagextsobjects[[(((i - 1) * nrow(sum_datesdf)) + j)]] <- usagexts[paste(sum_datesdf$startperioddate[j], sum_datesdf$endperioddate[j], sep = "/")]
}
else
{usagextsobjects[[(((i - 1) * nrow(sum_datesdf)) + j)]] <- tempxts[paste(sum_datesdf$startperioddate[j], sum_datesdf$endperioddate[j], sep = "/")]
}
}
}
这不是 :
for (i in 1:varcount)
{for (j in 1:nrow(sum_datesdf))
{if (i == 1)
{modelformulae <- paste0(paste(paste0(sum_datesdf$var1[i], "xts[", sum_datesdf$startperioddate[j]), sum_datesdf$endperioddate[j], sep = "/"),"]")
}
else
{modelformulae <- paste0(paste(paste0(sum_datesdf$var2[i], "xts[", sum_datesdf$startperioddate[j]), sum_datesdf$endperioddate[j], sep = "/"),"]")
}
usagextsobjects[[(((i - 1) * nrow(sum_datesdf)) + j)]] <- as.formula(modelformulae)
}
}
i==1的变量modelformulae内容如下:usagexts[2015-10-01/2016-03-31]
。但这并不能转化为创建相关的 xts 对象
sum_datesdf数据框是这样的:
startperioddate,endperioddate,checkval,var1,var1_1,var2,var2_1,varname1,varname1_1,varname2,varname2_1
1,2015-10-01,2016-03-31,1,usage,dusage,temp,dtemp,usage_1510_1603,dusage_1510_1603,temp_1510_1603,dtemp_1510_1603
6,2016-10-01,2017-03-31,1,usage,dusage,temp,dtemp,usage_1610_1703,dusage_1610_1703,temp_1610_1703,dtemp_1610_1703
11,2017-10-01,2018-03-31,1,usage,dusage,temp,dtemp,usage_1710_1803,dusage_1710_1803,temp_1710_1803,dtemp_1710_1803
我期望对象 'usagextsobjects' 包含 6 个 xts 对象的列表。使用第一个代码可以,但使用第二个代码则不行。
错误是这样说的:
Error in
[.xts
(usagexts, 2015 - 10 - 1/2016 - 3 - 31) : subscript out of bounds
通常,要通过字符串引用命名对象,您需要使用 get()
而不仅仅是您尝试使用 paste
调用的字符串本身。而且您不是根据需要 as.formula
的字符串构建公式对象,因此请删除该调用。请参阅下面的调整:
for (i in 1:varcount)
{for (j in 1:nrow(sum_datesdf))
{if (i == 1)
{ data <- get(sum_datesdf$var1[i])[paste(sum_datesdf$startperioddate[j], sum_datesdf$endperioddate[j], sep = "/")]
}
else
{ data <- get(sum_datesdf$var2[i])[paste(sum_datesdf$startperioddate[j], sum_datesdf$endperioddate[j], sep = "/")]
}
usagextsobjects[[(((i - 1) * nrow(sum_datesdf)) + j)]] <- data
}
}
但是,请考虑使用 Map
(mapply
的包装器)按元素遍历 sum_datesdf 列并构建所需的列表,而不是通过嵌套的 for
循环初始化和分配。此外,分成两个 Map
调用与 c()
绑定在一起用于单个列表:
get_data <- function(obj, start, end) {
get(obj)[paste(start, end, sep = "/")]
}
usagextsobjects <- with(sum_datesdf,
c(Map(get_data, var1, startperioddate, endperioddate),
Map(get_data, var2, startperioddate, endperioddate)
)
)