2015-07-31 4 views
1

Я хочу итеративно присваивать вектор строк именам (как в именах столбцов матрицы) объектов, которые они представляют. Пример:Итеративно изменить имена (имена столбцов) объектов времени xxts

> 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», но я хочу сделать это итеративно во многих временных рядах. Нечто подобное было бы неплохо в цикле (я знаю, что это считается дурным тоном и может использовать применить вместо этого),

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

, но, конечно, это не работает. Я пробовал много подходов, и никто не работал. Полагаю, я мог бы объединить их в матрицу и итеративно назвать столбцы, а затем удалить столбцы в отдельные таймсерии, но это кажется довольно грубым.

+1

Try 'LST <- MGET (имена); lapply (имена (ЛСТ), функция (х) {x1 < - lst [[x]]; colnames (x1) <- x; x1}) ' – akrun

+0

@akrun: почему бы не ответить? Я знаю, что _might_ будет дубликатом, но 'mget' является довольно высоким уровнем R, даже нам это кажется очевидным. –

+0

@BondedDust Спасибо за комментарий. Я ждал ответа OP, поскольку я не тестировал код. – akrun

ответ

0

Вот что ОП говорит работал на них, даже если это не воспроизводимые:

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]]) 
} 
Смежные вопросы