Подмножество объекта xts с использованием переменных для самого объекта xts - PullRequest
0 голосов
/ 21 января 2019

У меня есть 2 ряда данных, а именно 'usexts' и 'tempxts'. Я хочу создать 3 подмножества для каждого из 2 объектов. Я могу сделать это для каждой серии отдельно циклически по параметрам даты, используя переменные для начального и конечного периодов. Нет проблем там. Тем не менее, я хочу сделать то же самое для циклов 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

Я ожидал, что объект 'usextsobjects' будет содержать список из 6 объектов xts. Используя первый код, он делает, но используя второй код, он не делает.

Ошибка говорит это:

Ошибка в [.xts (usexts, 2015 - 10 - 1/2016 - 3 - 31): нижний индекс вне границ

1 Ответ

0 голосов
/ 22 января 2019

Обычно, чтобы ссылаться на именованный объект по строке, вам нужно использовать 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)
                             )
                       )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...