【问题标题】:Subset xts object using variables for xts object itself使用 xts 对象本身的变量子集 xts 对象
【发布时间】:2019-06-15 06:55:09
【问题描述】:

我有 2 个数据系列,即“usageexts”和“tempxts”。我想为 2 个对象中的每一个创建 3 个子集。我可以为每个系列单独循环使用开始和结束期间的变量来遍历日期参数。那里没问题。但是,我也想对 2 系列循环遍历 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的变量模型公式内容如下: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

我期待对象“usageextsobjects”包含 6 个 xts 对象的列表。使用第一个代码,它可以,但使用第二个代码它不会。

错误是这样说的:

[.xts(usageexts, 2015 - 10 - 1/2016 - 3 - 31) 中的错误: 下标越界

【问题讨论】:

  • 你在第二块尝试什么? xts 对象 usageextstempxts 都在第一个块中循环。
  • 我试图创建一个可以执行的命令,给我一个 xts 对象,其中包含从 01O/Oct15 到 31/Mar/16 等的数据。与 i = 1 和 j = 1 的示例一样,字符串输出为“usageexts[2015-10-01/2016-03-31]”。目的是可以执行此操作以给我所需的时间序列对象。 “sum_datesdf$var1[1]”的内容是“用法”。

标签: r xts


【解决方案1】:

通常,要通过字符串引用命名对象,您需要使用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
        }
    }

但是,请考虑使用Mapmapply 的包装器)逐元素迭代您的 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)
                             )
                       )

【讨论】:

  • 谢谢 Parfait > 这对我来说有点拗口!我确信它有效,但我需要自己尝试一下。慢慢地。你已经用勾号做了标记,但是如果我以后需要做,你能告诉我怎么做吗?
  • 只要在上面运行,看看解决方案是否有效。只接受可以回答您的问题的解决方案,并向未来的读者发出信号。见How does accepting answer work?
  • 谢谢!好东西。第一个有效。检查第二个!采纳答案!现在我知道该怎么做了!
猜你喜欢
  • 2013-05-27
  • 2017-07-27
  • 1970-01-01
  • 2014-09-01
  • 2013-12-30
  • 1970-01-01
  • 2013-03-15
  • 2011-11-06
  • 2012-08-15
相关资源
最近更新 更多