2016-10-27 1 views
0

У меня есть список с тремя xts, который содержит один столбец.Как выровнять число значений в списке?

:'xts' : 250 obs. of 1 variable: 
:'xts' : 245 obs. of 1 variable: 
:'xts' : 250 obs. of 1 variable: 

XTS второе количество значений наименьшее.

Как сбалансировать количество переменных в этом списке? (Следует помнить, что XTS имеет переменную как время.)

Ниже приведен пример того, как я хотел бы сделать:

index time  xts1 xts2 xts3 
    1 2016-10-27 10 34 7 
    2 2016-10-26 41  16 
    3 2016-10-25 19 60 25 
    4 2016-10-24 50  92 
    5 2016-10-23 34 75 6 

Если некоторые значения не, просто удалите строки с недостающим стоимость. То есть, удалите 2 и 4 строки в список.

ответ

1

Предположив ваши данные в dataframe, вы могли бы сделать:

df[rowSums(df[,3:5] == '') == 0,] 

результат:

index  time xts1 xts2 xts3 
1  1 2016-10-27 10 34 7 
3  3 2016-10-25 19 60 25 
5  5 2016-10-23 34 75 6 

Если недостающие значения представлены NA с, то вы должны изменить его на:

df[rowSums(is.na(df[,3:5])) == 0,] 

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


Как @aichao отмечалось, при наличии отдельных xts объектов, вы можете использовать merge с all = FALSE, чтобы объединить их в одно целое. Тем не менее, я хотел бы использовать комбинацию Reduce и merge (source):

xts.c <- Reduce(function(...) merge(..., all = FALSE), list(xts1,xts2,xts3)) 
names(xts.c) <- c('xts1','xts2','xts3') 

Результат:

> xts.c 
      xts1 xts2 xts3 
2016-10-23 34 75 6 
2016-10-25 19 60 25 
2016-10-27 10 34 7 
3

Это стоит того, чтобы начать использовать NA для отсутствующих значений, а не пустые пространства. Для целей структуры данных важно выполнить эту настройку. Многие объекты R должны быть одного типа. Вставка заготовок приводит к принуждению матриц и векторов к типу "character". Это не является желательным поведением, если будут использоваться функции, требующие элементов numeric.

Вы можете подмножество в xts объект так же, как вы бы матрица:

#Example 
mat 
       Open  High  Low Close 
2007-01-02 50.03978 50.11778 49.95041 50.11778 
2007-01-03 50.23050  NA 50.23050 50.39767 
2007-01-04 50.42096 50.42096 50.26414 50.33236 
2007-01-05 50.37347  NA 50.22103 50.33459 
2007-01-06 50.24433 50.24433 50.11121 50.18112 
2007-01-07 50.13211 50.21561 49.99185 49.99185 
2007-01-08 50.03555  NA 49.96971 49.98806 
2007-01-09 49.99489 49.99489 49.80454 49.91333 

Мы можем подмножестве, как мы это обычно:

mat2 <- mat[!is.na(mat[,2]),] 
1

Поскольку ваши XTS объекты уже в списке, проще всего использовать do.call, чтобы позвонить merge со своим списком. do.call позволяет передавать список объектов merge вместо того, чтобы вводить все их имена вручную.

library(xts) 
# example data 
dates <- seq(as.Date("2016-10-23"), as.Date("2016-10-27"), by = "day") 
xtslist <- list(
    xts1 = xts(c(34, 50, 19, 41, 10), dates), 
    xts2 = xts(c(75, 60, 34), dates[c(1, 3, 5)]), 
    xts3 = xts(c(6, 92, 25, 16, 7), dates)) 
# merge all list elements into a single xts object 
# Note: do.call(merge, xtslist) is equivalent to 
#  merge(xtslist[[1]], xtslist[[2]], xtslist[[3]]) 
(myxts <- do.call(merge, xtslist)) 
#   xts1 xts2 xts3 
# 2016-10-23 34 75 6 
# 2016-10-24 50 NA 92 
# 2016-10-25 19 60 25 
# 2016-10-26 41 NA 16 
# 2016-10-27 10 34 7 

Если вы хотите, чтобы пропустить строки с NA, можно либо вызвать na.omit(myxts), или вы можете использовать all = FALSE аргумент merge.xts. Вот как вы укажете all = FALSE в своей команде do.call.

(myxts2 <- do.call(merge, c(xtslist, all = FALSE))) 
#   xts1 xts2 xts3 
# 2016-10-23 34 75 6 
# 2016-10-25 19 60 25 
# 2016-10-27 10 34 7 
Смежные вопросы