R: таблица и даты - PullRequest
       4

R: таблица и даты

19 голосов
/ 28 декабря 2011

У меня есть следующие данные:

transaction <- c(1,2,3);
date <- c("2010-01-31","2010-02-28","2010-03-31");
type <- c("debit", "debit", "credit");
amount <- c(-500, -1000.97, 12500.81);
oldbalance <- c(5000, 4500, 17000.81)
evolution <- data.frame(transaction, date, type, amount, oldbalance, row.names=transaction, stringsAsFactors=FALSE);
evolution <- transform(evolution, newbalance = oldbalance + amount);
evolution

Запуск

> library(xtable)
> xtable(evolution)

работает нормально.Но если я добавлю строку

evolution$date <- as.Date(evolution$date, "%Y-%m-%d");

, чтобы дать

transaction <- c(1,2,3);
date <- c("2010-01-31","2010-02-28","2010-03-31");
type <- c("debit", "debit", "credit");
amount <- c(-500, -1000.97, 12500.81);
oldbalance <- c(5000, 4500, 17000.81)
evolution <- data.frame(transaction, date, type, amount, oldbalance, row.names=transaction, stringsAsFactors=FALSE);
evolution$date <- as.Date(evolution$date, "%Y-%m-%d");
evolution <- transform(evolution, newbalance = oldbalance + amount);
evolution

, то выполнение xtable даст

xtable (evolution) Ошибка в Math.Date(x + ifelse (x == 0, 1, 0)): abs не определен для объектов Date

Но в таком случае может быть полезно использовать xtable, чтобы выполнить некоторую фильтрациюдаты

evolution$date <- as.Date(evolution$date, "%Y-%m-%d")
startdate <-as.Date("2010-02-01");
enddate <-as.Date("2010-03-30");
newdate <-evolution[which (evolution$date >= startdate & evolution$date <= enddate),]
newdate


> newdate
  transaction       date  type   amount oldbalance newbalance
2           2 2010-02-28 debit -1000.97       4500    3499.03
> xtable(newdate)
Error in Math.Date(x + ifelse(x == 0, 1, 0)) :
  abs not defined for Date objects

Ответы [ 3 ]

22 голосов
/ 28 декабря 2011

Возможно, это ошибка в xtable - вы можете сообщить об этом сопровождающему.

Временным обходным решением является вызов as.character() для классов, которые xtable неверно истолковывают (кроме «Дата», я могу думать о «POSIXt», но могут быть и другие), например ::

xtable <- function(x, ...) {
   for (i in which(sapply(x, function(y) !all(is.na(match(c("POSIXt","Date"),class(y))))))) x[[i]] <- as.character(x[[i]])
   xtable::xtable(x, ...)
}
11 голосов
/ 28 декабря 2011

Похоже, что xtable не всегда хорошо работает со столбцами класса Date.(У него есть методы zoo и ts , но они могут не помочь, если в кадре данных есть один столбец дат / времени, как приведение к zoo появляется, чтобы изменить имена столбцов в результирующей таблице.) Несколько замечаний:

  1. Ошибка на самом деле выдается print.xtable (не xtable.data.frame), который называетсяпо умолчанию для отображения результатов xtable в консоли.Таким образом, вы обнаружите, что если вы сохраните результаты xtable в переменной, вы не получите никакой ошибки, но затем, когда вы попытаетесь print, появится такая же ошибка.

  2. Поскольку вы грамотно сохранили свои даты в формате ГГГГ-ММ-ДД, преобразование их в объекты Date фактически не является необходимым для использования упорядоченных выборок, поскольку они будут правильно сортироваться как символы.Таким образом, вы можете просто оставить их как символы.

  3. В случаях с более сложными объектами даты / времени вы можете сначала выполнить поднабор, а затем преобразовать эти столбцы в символы.Или создайте оболочку для xtable.data.frame и добавьте строки в начале,

    dates <- sapply(x,FUN = function(x){class(x) == "Date"})
    x[,dates] <- as.character(x[,dates])
    

    , проверяя класс Date или любой другой класс, с которым вы имеете дело.

  4. IMHO, xtable.data.frame, вероятно, должны проверять Dates и, возможно, другие POSIX-классы, а также преобразовывать их в строки.Это может быть простым изменением, и, возможно, стоит обратиться к автору пакета по поводу

  5. Наконец, точки с запятой в качестве ограничителей строки не нужны.:) Привычка с другого языка?

0 голосов
/ 03 июля 2019

Как сопровождающий xtable, я хотел бы заявить о том, что я считаю истинной позицией в отношении дат в xtable.

Это на самом деле не ошибка, но отсутствие функции, которая может показаться вам желательной.

Проблема в том, что xtable может работать только с тремя различными классами столбцов: логический; персонаж; и числовой. Если вы попытаетесь отправить таблицу с классом столбца Date, он не сможет справиться с этим. Соответствующий код представляет собой набор методов xtable, наиболее важными из которых являются xtable.data.frame и xtable.matrix.

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

Можно было бы добавить код и для столбцов класса Date, но я не хочу этого делать.

Во-первых, существует легкий обходной путь (по крайней мере, для прямого кода R, я не могу сказать, для приложений Shiny), который заключается в замене любого столбца Date на символьный столбец:

Во-вторых, чтобы разрешить столбцы класса Date, потребуется добавить аргумент к методам xtable и xtable (которых в настоящее время 31), а также к xtableFtable и xtableList. Это чревато проблемами из-за большого количества обратных зависимостей для xtable. (Не в счет, но если вы посмотрите на xtable в CRAN, вы увидите стек зависимостей, импорт и предложения.) Я собираюсь разбить некоторые пакеты, может быть, много пакетов, если я сделаю такое изменение. Обратная совместимость - серьезная проблема с xtable.

Зачем нужен дополнительный аргумент? Потому что конечным результатом использования xtable, или более того, до точки print.xtable, является строка символов. То, как обрабатываются столбцы фрейма данных, матрицы или другой структуры, представленной в xtable, определяется сначала тем, как они классифицируются (логические, символьные или числовые), затем аргументами align, digits и display, которые могут быть векторами, которые позволяют для разной обработки разных колонн. Поэтому, если даты должны быть разрешены, вам понадобится дополнительный аргумент, чтобы указать, как они будут форматироваться, потому что в какой-то момент их необходимо преобразовать в символ для получения окончательного результата таблицы.

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