R устанавливает имя столбца на do.call (rbind) - PullRequest
0 голосов
/ 21 февраля 2020

Итак, я хочу добавить столбец совокупного объема к объекту XTS. Однако после вызова do.call(rbind... я обнаружил, что исходный XTS перезаписывается.

# Reproducible example data
foo <- rnorm(5)
bar <- seq(as.Date("1970-01-01"), length = 5, by = "days")
foobar <- xts(x = foo, order.by = bar)
names(foobar)[1] <- "Volume"
# My processing ...
foobar_months <- split(foobar[,"Volume"],f="months")
foobar_vol_mtd <- lapply(foobar_months,FUN=cumsum)
# This is what is not working for me because Volume overwrites original Volume
foobar <- do.call(rbind,foobar_vol_mtd) 

1 Ответ

1 голос
/ 21 февраля 2020

Функция do.call(rbind, list) сделает rbind всех элементов списка. Вы не добавляете этот список к оригиналу. Что вы можете сделать:

foobar2 <- do.call(rbind,foobar_vol_mtd)
foobar <- rbind(foobar, foobar2)

rbind все элементы в этом списке вместе, а затем rbind результат к оригиналу.

Result:

               Volume
1970-01-01  0.8995890
1970-01-01  0.8995890
1970-01-02 -0.5057975
1970-01-02  0.3937916
1970-01-03 -0.1861275
1970-01-03  0.2076641
1970-01-04 -1.1641303
1970-01-04 -0.9564663
1970-01-05  0.3157536
1970-01-05 -0.6407127

Результаты будут изменяются из-за rnorm(5) и отсутствия начального набора.

Добавить как новые столбцы

Как я уже сказал, rbind добавляет новые строки, и все столбцы должны быть одинаковыми , Если вы хотите добавить новый столбец, попробуйте:

foobar2 <- do.call(rbind,foobar_vol_mtd)
foobar3 = merge(foobar, foobar2)

Мой результат для этого случая (новые случайные значения, поэтому не сравнивайте с приведенным выше):

                Volume  Volume.1
1970-01-01  1.96291153 1.9629115
1970-01-02 -0.41771710 1.5451944
1970-01-03 -0.08827657 1.4569179
1970-01-04 -0.57243569 0.8844822
1970-01-05 -0.06093953 0.8235426

Затем измените имя столбца с помощью names(foobar)[2] = "new_name".

Вы можете также переименовать перед объединением:

foobar2 <- do.call(rbind,foobar_vol_mtd)
names(foobar2) = 'newname'
foobar3 = merge(foobar, foobar2)

И объединение будет выполнено с указателем времени, как и раньше.

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