Нет данных с data.table - PullRequest
       17

Нет данных с data.table

0 голосов
/ 02 июля 2018

У меня есть data.table

require(data.table)
require(lubridate)
testDT <- data.table(dateA = c(NA,NA), dateB = c(ymd("20110101"),ymd("20100101")))
testDT
#       dateA      dateB
#    1:    NA 2011-01-01
#    2:    NA 2010-01-01

Я хотел бы сделать следующую операцию: если dateA - NA, используйте то же значение, что и в dateB. Я пробовал следующую команду:

> testDT[is.na(dateA), dateA := dateB]
Warning message:
In `[.data.table`(testDT, is.na(dateA), `:=`(dateA, dateB)) :
  Coerced 'double' RHS to 'logical' to match the column's type; may have truncated precision. Either change the target column ['dateA'] to 'double' first (by creating a new 'double' vector length 2 (nrows of entire table) and assign that; i.e. 'replace' column), or coerce RHS to 'logical' (e.g. 1L, NA_[real|integer]_, as.*, etc) to make your intent clear and for speed. Or, set the column type correctly up front when you create the table and stick to it, please.

Как видите, появилось предупреждение, и результат странный:

> testDT
   dateA      dateB
1:  TRUE 2011-01-01
2:  TRUE 2010-01-01

Почему это не работает?

P.S. Я знаю, что мы можем использовать:

> testDT[,dateA := ifelse(is.na(dateA), dateB, dateA)]
> testDT
   dateA      dateB
1: 14975 2011-01-01
2: 14610 2010-01-01
> testDT[,dateA := as.Date(dateA, origin = "1970-01-01")]
> testDT
        dateA      dateB
1: 2011-01-01 2011-01-01
2: 2010-01-01 2010-01-01

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вы получаете это предупреждающее сообщение, потому что столбец dateA не имеет нужного класса (как уже упоминалось @ Emmanuel-Lin):

> str(testDT)
Classes ‘data.table’ and 'data.frame':    2 obs. of  2 variables:
 $ dateA: logi  NA NA
 $ dateB: Date, format: "2011-01-01" "2010-01-01"
 - attr(*, ".internal.selfref")=<externalptr>

Возможное решение - сначала преобразовать столбец dateA в класс дат с помощью либо as.Date, либо встроенных функций даты :

# convert 'dateA'-column to 'Date'- class first
testDT[, dateA := as.Date(dateA)]   # alternatively: as.IDate(dateA)

# fill the 'NA' values in the 'dateA'-column
testDT[is.na(dateA), dateA := dateB][]

, что дает:

> testDT
        dateA      dateB
1: 2011-01-01 2011-01-01
2: 2010-01-01 2010-01-01
0 голосов
/ 02 июля 2018

Поскольку у вас есть только NA в первом столбце, он предполагает, что это логично.

Если вы добавите один элемент, который не является NA, он отлично работает:

Ваш пример с еще одним элементом

require(data.table)
require(lubridate)
testDT <- data.table(dateA = c(NA,NA, ymd("20110101")), dateB = c(ymd("20110101"),ymd("20100101"), ymd("20100101")))

testDT[is.na(dateA), dateA := dateB]

Результат:

> testDT
   dateA      dateB
1: 14975 2011-01-01
2: 14610 2010-01-01
3: 14975 2010-01-01

Так почему у вас есть только АН?

...