【问题标题】:Iteratively change the names (column names) of xts timeseries objects迭代更改 xts 时间序列对象的名称(列名)
【发布时间】:2015-07-31 20:24:58
【问题描述】:

我想迭代地将一个字符串向量分配给它们所代表的对象的名称(如矩阵的列名)。示例:

> Names
[1] "gs2"  "gs3"  "gs5"  "gs7"  "gs10"

对象是xts个利率时间序列,例如:

> head(gs2,3)
           gs2Day
1976-06-01 0.0702
1976-07-01 0.0674
1976-08-01 0.0650
> class(gs2)
[1] "xts" "zoo"

因此,对于这个时间序列对象,我想将名称从“gs2Day”更改为“gs2”,但我想在多个时间序列中迭代地执行此操作。像这样的东西在 for 循环中会很好(我知道它被认为是不好的形式,可以使用 apply 代替),

> names(noquote(Names)[i]) = Names[i]

但它当然不起作用。我尝试了很多方法,但都没有奏效。我想我可以将它们合并到一个矩阵中并迭代地命名列,然后将这些列剥离为单独的时间序列,但这似乎相当粗糙。

【问题讨论】:

  • 试试lst <- mget(Names);lapply(names(lst), function(x) {x1 <- lst[[x]]; colnames(x1) <- x; x1 })
  • @akrun:为什么不作为答案?我知道可能是重复的,但mget 是相当高的 R 级别,即使对我们来说似乎很明显。
  • @BondedDust 感谢您的评论。我正在等待 OP 响应,因为我没有测试代码。
  • 感谢 akrun 的想法,但它没有满足我的需求。这有效:
  • 我无法在回复评论中插入代码 - 收到错误消息:“245 个字符太长”。寻找解决方案没有成功。关于如何用代码回复的任何建议?用反引号尝试了 cntrl-k 和周围的代码。

标签: r xts


【解决方案1】:

这就是 OP 所说的对他们有用的东西,即使它不可重现:

fredTable <-
structure(list(Symbol = structure(c(3L, 1L, 4L, 2L, 5L),
  .Label = c("CASACBM027SBOG", "FRPACBW027SBOG", "TLAACBM027SBOG", "TOTBKCR",
  "USNIM"), class = "factor"), Name = structure(1:5, .Label = c("bankAssets",
  "bankCash", "bankCredWk", "bankFFRRPWk", "bankIntMargQtr"), class = "factor"),
  Category = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "Banks", class = "factor"),
  Country = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "USA", class = "factor"),
  Lead = structure(c(1L, 1L, 3L, 3L, 2L), .Label = c("Monthly", "Quarterly",
  "Weekly"), class = "factor"), Freq = structure(c(2L, 1L, 3L, 3L, 4L),
  .Label = c("1947-01-01", "1973-01-01", "1973-01-03", "1984-01-01"),
  class = "factor"), Start = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "Current",
  class = "factor"), End = c(TRUE, TRUE, TRUE, TRUE, FALSE), SeasAdj = c(FALSE,
  FALSE, FALSE, FALSE, TRUE), Percent = structure(c(1L, 1L, 1L, 1L, 1L),
  .Label = "Fed", class = "factor"), Source = structure(c(1L, 1L, 1L, 1L, 1L),
  .Label = "Res", class = "factor"), Series = structure(c(1L, 1L, 1L, 1L, 2L),
  .Label = c("Level", "Ratio"), class = "factor")), .Names = c("Symbol", "Name", 
  "Category", "Country", "Lead", "Freq", "Start", "End", "SeasAdj", "Percent",
  "Source", "Series"), class = "data.frame",
  row.names = c("1", "2", "3", "4", "5"))
fredNamesOrig <- fredTable$Name     # original downloaded FRED object names
fredObjOrig <- mget(fredNamesOrig)  # list of original FRED objects
fredNamesTrans <- fredNamesOrig     # pre-allocate list of transformed objects
# Strip off period string ("Day", "Qtr")
for(i in 1:length(fredNamesOrig)){
    if(grepl("Day",fredNamesOrig[i]))
        fredNamesTrans[i] <- sub("Day","",fredNamesOrig[i])
    else if(grepl("Qtr",fredNamesOrig[i]))
        fredNamesTrans[i] <- sub("Qtr","",fredNamesOrig[i])
}

# Assign transformed series back to appropriately names series:
for(i in 1:length(fredObjOrig)){
  colnames(fredObjOrig[[i]]) <- fredNamesTrans[i]
  assign(fredNamesTrans[i],fredObjOrig[[i]])
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 2018-04-16
    • 2012-07-17
    • 1970-01-01
    • 2020-08-27
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多