Слияние xts в R - Преобразование символов в NA - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть 3 объекта xts

logged <- xts::xts(x = loggedInUsers$loggedInUsers, order.by = Sys.time())
loadValue <- xts::xts(x = loadAvg, order.by = Sys.time())
hostname <- xts::xts(x = loadHost, order.by = Sys.time())

dput(hostname)
dput(loadValue)
dput(logged)

dput дает следующий результат

 structure("deliverforgoodportal", .Dim = c(1L, 1L), index = structure(1551088127.27724, tzone = "", tclass = c("POSIXct",
    "POSIXt")), class = c("xts", "zoo"), .indexCLASS = c("POSIXct",
    "POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "", tzone = "")

structure(0, .Dim = c(1L, 1L), .Dimnames = list(NULL, "load"), index = structure(1551088127.27676, tzone = "", tclass = c("POSIXct",
"POSIXt")), .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct",
"POSIXt"), .indexTZ = "", tzone = "", class = c("xts", "zoo"))

structure(1, .Dim = c(1L, 1L), index = structure(1551088127.27637, tzone = "", tclass = c("POSIXct",
"POSIXt")), class = c("xts", "zoo"), .indexCLASS = c("POSIXct",
"POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "", tzone = "")

Когда я объединяю эти три и печатаю имя хоста, преобразуется в NA

  tmp <- merge.xts(hostname, logged, loadValue, all = TRUE)
    print(tmp)

Вывод: (имя хоста - NA)

                    hostname logged  load
2019-02-25 09:48:47       NA      1    NA
2019-02-25 09:48:47       NA     NA    0
2019-02-25 09:48:47       NA     NA    NA

Почему это происходит как NA?

1 Ответ

0 голосов
/ 25 февраля 2019

Вы должны понимать, что объект xts является серией времени и матрицей.Теперь матрица может содержать только один тип значений: символьные или числовые.Но не оба.Ваше объединение пытается объединить матрицу символьных значений (имя хоста) с числовыми значениями (записано и загружено).Это приводит к тому, что значения имени хоста приводятся к NA.

Если вы хотите объединить эти данные, вы должны использовать data.frame (или data.table).Также обратите внимание, что ваши значения времени не равны, они в миллисекундах.Так что, если вы хотите присоединиться за минуты, сначала используйте floor_date из пакета lubridate.Ниже приведены два примера с и без lubridate.Я использую пакет timetk для преобразования объектов xts в таблицу, но в зависимости от ваших исходных данных это может не понадобиться.

с full_join, без смазки

library(timetk)
library(dplyr)
hostname <- tk_tbl(hostname)
loadValue <- tk_tbl(loadValue)
logged <- tk_tbl(logged)

hostname %>% 
  full_join(loadValue) %>% 
  full_join(logged, 
            by = "index", 
            suffix = c("_hostname", "_logged"))

Joining, by = "index"
# A tibble: 3 x 4
  index               value_hostname        load value_logged
  <dttm>              <chr>                <dbl>        <dbl>
1 2019-02-25 10:48:47 deliverforgoodportal    NA           NA
2 2019-02-25 10:48:47 NA                       0           NA
3 2019-02-25 10:48:47 NA                      NA            1

с lubridate и левым соединением:

hostname %>% 
  mutate(index = lubridate::floor_date(index, unit = "seconds")) %>% 
  left_join(loadValue %>% mutate(index = lubridate::floor_date(index, unit = "seconds"))) %>% 
  left_join(logged %>% mutate(index = lubridate::floor_date(index, unit = "seconds")), 
            by = "index", 
            suffix = c("_hostname", "_logged"))    

Joining, by = "index"
# A tibble: 1 x 4
  index               value_hostname        load value_logged
  <dttm>              <chr>                <dbl>        <dbl>
1 2019-02-25 10:48:47 deliverforgoodportal     0            1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...