使用xts对象本身的变量对xts对象进行子集

时间:2019-01-21 20:43:39

标签: r xts

我有2个数据系列,即“ usagexts”和“ tempxts”。我想为2个对象中的每一个创建3个子集。对于每个系列,我都可以使用开始和结束时间段的变量分别遍历date参数,从而做到这一点。没问题。但是,我也想对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

我期望对象'us​​agextsobjects'包含6个xts对象的列表。使用第一个代码可以,但是不使用第二个代码。

错误说明:

  

[.xts中的错误(usagexts,2015年10月1日至2016年3月31日):         下标超出范围

1 个答案:

答案 0 :(得分:0)

通常,要按字符串引用命名对象,您需要使用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 列逐元素进行迭代并构建所需的列表,而不是通过嵌套的{{1}进行初始化和分配}循环。另外,分为两个for调用,将它们与Map绑定在一起以形成一个列表:

c()