R, объединить все наборы данных по дате - PullRequest
0 голосов
/ 01 мая 2018

У меня есть код здесь: https://github.com/thistleknot/FredAPIR/blob/master/SemanticFilter.R

Я перебираю parsedList

a=1
for (i in parsedList)
{
  test1 <- fred$series.observations(series_id = parsedList[a], observation_start = "2000-01-01", observation_end = "2018-03-01")
  test2 <- fred$series.observations(series_id = parsedList[a+1], observation_start = "2000-01-01", observation_end = "2018-03-01")

  test %>>%
    select(
      date,
      value
    ) %>>%
    mutate(
      date = as.Date(date),
      value = as.numeric(value)
    ) ->
    dt1

  if (a>length(parsedList))
{
  test2 %>>%
    select(
      date,
      value
    ) %>>%
    mutate(
      date = as.Date(date),
      value = as.numeric(value)
    ) ->
    dt2

  dt2[dt1, on = c('date')]

}


  a=a+1
}

что я хотел бы сделать, это объединить (объединить?) Все эти parsedList по дате, чтобы все наборы данных (которые в настоящее время состоят из "date" и "value") были объединены по дате.

Я хотел бы использовать функцию слияния (из data.table?), Но хотел бы перебрать весь parsedList и привести к одному набору данных только с датой и множеством значений (из каждого набора данных parsedList).

Примечание [a] = переменная счетчика. Это сложная часть здесь. Как мне объединить все итерации теста, представляющие собой отдельные списки parsedList [a], в один список? Например ... parsedList [1] & parsedList [2] & parsedList [3] и ... и так до тех пор, пока не будет обработан последний элемент parsedList [length (parsedList)]. Таким образом, каждый parsedList [] имеет свою собственную дату, пару значений. Поэтому мне нужно сохранить каждое значение, но дата - это переменная присоединения.

Заметьте, это не только функциональный вопрос, но и логический вопрос.

1 Ответ

0 голосов
/ 02 мая 2018

Вот моя рекомендация. Я до сих пор не знаю, что такое fred и откуда оно, ни parsedList, поэтому я не могу провести никакого тестирования. Но, надеюсь, это поможет понять идею.

# first download all the data    
data_list = lapply(parsed_list, function(a)
    fred$series.observations(
        series_id = a,
        observation_start = "2000-01-01",
        observation_end = "2018-03-01"
    )
)

# define function to process the data
# we plan on re-naming the "value" column so each one is distinct
process_data = function(d, value_name) {
    d = d[, c("date", "value")]
    d$date = as.Date(d$date)
    d$value = as.numeric(d$value)
    names(d)[2] = value_name
    return(d)
}

# process the data
data_list_processed = list()
for (i in seq_along(data_list)) {
    data_list_processed[[i]] = process_data(data_list[[i]], value_name = paste0("value", i))
}

# merge the data
combined_data = Reduce(merge, data_list_processed)

Разбиение вашего кода на такие шаги делает его более модульным и дает вам возможность отлаживать каждый шаг отдельно. Это также позволяет вам легко использовать другие биты кода, такие как строка Reduce, которая объединяет все наборы данных по дате.

Единственная причина, по которой я могу подумать о том, чтобы сделать все шаги сразу, - это если данные настолько велики, что вы не можете поместить их все в память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...