zoo: пропущенные значения в 'row.names' не допускаются - PullRequest
3 голосов
/ 14 марта 2019

Я не уверен, почему я получаю <NA> в индексе, когда я использую MATCH с объектом зоопарка. Предположим, у меня есть следующее:

a <- read.zoo(data.frame(date=as.Date('2011-12-31') + 0:49, col1=seq(1,50), col2=seq(11,60)), FUN = as.Date)
mon <- read.zoo(data.frame(date=c(as.Date('2012-01-01'), as.Date('2012-02-01'), as.Date('2012-03-01')), mc=letters[1:3], mc2=LETTERS[1:3]), FUN = as.Date)

Тогда я пытаюсь соответствовать:

mon$matched <- a[MATCH(index(mon),index(a))]$col1

Затем я попытался посмотреть, как выглядит mon, и получить сообщение об ошибке:

View(mon)
Error in View : missing values in 'row.names' are not allowed

Глядя на mon дальше, я не уверен, откуда взялась дополнительная строка <NA>:

mon
           mc   mc2  matched
2012-01-01 a    A    2      
2012-02-01 b    B    33     
2012-03-01 c    C    <NA>   
<NA>       <NA> <NA> <NA>   

Как правильно сделать этот матч? Результат правильный, за исключением последней строки, в которой все значения равны <NA>. Должно быть, я делаю что-то в корне неправильно ...

Ответы [ 2 ]

2 голосов
/ 16 марта 2019

Кажется, вы пытаетесь создать левое соединение.Для этого обычно используется merge.Два элемента аргумента all = c(TRUE, FALSE), показанные в приведенном ниже коде, относятся к тому, сохраняем ли мы несопоставленные даты в mon и a соответственно.
library (zoo)

a <- zoo(cbind(col1 = 1:50, col2 = 11:60), as.Date("2011-12-31") + 0:49)
mon <- zoo(cbind(mc = letters[1:3], mc2 = LETTERS[1:3]), 
           as.Date(c('2012-01-01', '2012-02-01', '2012-03-01')))

merge(mon, a, all = c(TRUE, FALSE))

давая:

           mc mc2 col1 col2
2012-01-01 a  A   2    12  
2012-02-01 b  B   33   43  
2012-03-01 c  C   <NA> <NA>

Если вы хотите только col1, тогда:

merge(mon, a, all = c(TRUE, FALSE))$col1

Если вам не нужна строка с NA, укажите FALSE, чтобы исключить несоответствующие даты из mon иa:

merge(mon, a, all = FALSE)

ИНДЕКСИРОВАНИЕ ПО ВРЕМЕНИ

Это также можно сделать с помощью индексации времени следующим образом:

result <- mon
result$col1 <- a$col1[time(mon)]  # does an implicit merge
result

, давая:

           mc mc2 col1
2012-01-01 a  A   2   
2012-02-01 b  B   33  
2012-03-01 c  C   <NA>

Если вам не нужна строка NA, этого будет достаточно:

a[time(mon)]

, давая:

           col1 col2
2012-01-01    2   12
2012-02-01   33   43

MATCH

1) Хотя вышеприведенные подходы рекомендуются вместо MATCH, если вы по какой-то причине хотите использовать MATCH, добавьте аргумент nomatch = 0, чтобы он возвращал 0 вместо NA для несоответствий.Это приведет к тому, что индексирование просто отбросит это значение.Присвоение result$col1 будет выполнять неявное merge заполнение NA.

result <- mon
result$col1 <- a$col1[MATCH(time(mon), time(a), nomatch = 0)]
result

, давая:

           mc mc2 col1
2012-01-01 a  A   2   
2012-02-01 b  B   33  
2012-03-01 c  C   <NA>

result$dol1 можно использовать для получения только col1.

2) Другой способ сделать это - следующий, который дает тот же результат.В этом случае правая часть имеет три элемента, третий из которых - NA, но поскольку правая часть теперь представляет собой простой вектор, она просто копирует элемент за элементом в результат $ col1, а не выполняет неявное слияние.

result <- mon
result$col1 <- coredata(a$col1)[MATCH(time(mon), time(a))]
result

Другое

Обратите внимание, что то, что в вопросе упоминается как row.names, является индексом времени, а не именами строк.

2 голосов
/ 15 марта 2019

Если вы посмотрите на объект a, вы обнаружите, что даты заканчиваются на

> a
           col1 col2
2011-12-31    1   11
2012-01-01    2   12
<snipped most of them>
2012-02-16   48   58
2012-02-17   49   59
2012-02-18   50   60

Итак, внутри создания matched вы получили:

 MATCH(index(mon),index(a))
[1]  2 33 NA

Это то, что создало ряд всех АН

a[MATCH(index(mon),index(a)) ]
 #--------
           col1 col2
2012-01-01    2   12
2012-02-01   33   43
<NA>         NA   NA

Из которого вы выбрали col1 предметов:

a[MATCH(index(mon),index(a))]$col1
#2012-01-01 2012-02-01       <NA> 
#         2         33         NA 

Функция [<- в библиотечном зоопарке сильно отличается от обычных [<- методов. Вы можете проверить код с:

 getAnywhere(`[<-.zoo` ) 

Он проверяет количество аргументов и определяет, какие из них вы дали, и соответственно изменяет свою логику. В таком случае, как ваш, где заданы только аргументы x и i, выполняется соответствующий процесс, который приводит к дополнительной записи в индексном векторе и, следовательно, к созданию дополнительной строки. Возможно, это не предполагаемое действие, и, возможно, в какой-то момент процесса должен был быть применен na.omit. Один из авторов зоопарка, @ G.Grothendeick, является постоянным посетителем и может прокомментировать дальше. Если так, то его слово - Закон. Если вы сделаете na.omit, вы получите ожидаемый результат:

mon$matched <- na.omit(a[MATCH(index(mon),index(a))]$col1)

> mon
           mc mc2 matched
2012-01-01 a  A   2      
2012-02-01 b  B   33     
2012-03-01 c  C   <NA> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...