Я получил базу данных транзакций, которая выглядит так:
AccountID PaymentDate PaymentAmount
8 13 2020-02-09 1.00
9 13 2020-01-25 4.20
10 14 2020-01-01 30.68
11 14 2020-02-01 30.68
PaymentDate в формате posix. С данными транзакций я не хочу агрегировать по временным интервалам (это хорошо задокументировано), но по ID.
Использование min () со временем Posix дает первый день, max () - последний день. Это информация, которая мне нужна для каждого удостоверения личности.
Хорошо, вот что я попробовал:
# 1.
summaryBy(PaymentDate ~ AccountID, data1, FUN=c(min) )
Fehler in tapply(lh.data[, lh.var[vv]], rh.string.factor, function(x) { : arguments must have same length
# 2.
ddply( data1, "AccountID", summarise, min(PaymentDate))
# returns 0 and warnings:
50: In output[[var]][rng] <- df[[var]] : Anzahl der zu ersetzenden Elemente ist kein Vielfaches der Ersetzungslänge
# 3.
aggregate(PaymentDate ~ AccountID, data1, min)
Fehler in model.frame.default(formula = PaymentDate ~ AccountID, data = data1) : ungültiger Typ (list) für die Variable 'PaymentDate'
По-видимому, агрегат не работает с положительным временем, если вам нужны агрегаты времени, а не агрегаты по времени.
Но получение первой и последней даты транзакции должно быть возможным?!
Ответить
Хорошо, так как я пока не могу ответить на свой вопрос, я разместил его здесь:
Интересно. Спасибо!
Обычно я использую опцию as.is = T с read.csv, а затем конвертирую время, используя strptime. Поэтому, когда я смотрю на структуру моих данных, я получаю:
$ PaymentDate : POSIXlt, format: "2020-02-04" "2020-02-04" "2020-02-04" ...
Для меня это не выглядит фактором. Я могу использовать min () и max () на весь столбец, и это работает. По-видимому, POSIXlt более хлопотно, чем я думал. Исходя из POSIXlt, я сделал
data$PaymentDate=as.Date(data$PaymentDate)
Глядя на структуру, класс правильно установлен как дата.
$ PaymentDate :Class 'Date' num [1:10000] 18296 18296 18296 18297 18297 ...
Теперь, похоже, работает. Однако только ddply возвращает правильный формат "2020-01-25", в то время как оба агрегат и summaryBy возвращаются в формате "18286". Это были дни с 1970-01-01? Ну, я думаю, я могу преобразовать это обратно.
foo=aggregate(PaymentDate ~ AccountID, data1, min)
as.Date(foo$PaymentDate,origin="1970-01-01")
Однако должно быть какое-то объяснение. Кроме того, ddply намного медленнее.
О, зачем мне сначала использовать strptime? Ну, дата в исходном файле в другом формате, "% d-% m-% y". Использование as.Date напрямую не помогло.
EDIT
dput моих данных
structure(list(AccountID = c(17L, 17L, 17L, 17L, 17L, 17L, 17L,
17L, 17L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L,
359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L,
359L, 359L, 359L, 359L, 365L, 939L, 939L, 939L, 997L, 997L, 1181L
), PaymentDate = structure(list(sec = c(0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), min = c(0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L), hour = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
mday = c(4L, 4L, 4L, 5L, 5L, 5L, 5L, 9L, 25L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 2L, 2L, 3L, 4L, 4L, 17L, 8L, 17L, 28L, 8L, 22L, 3L),
mon = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 2L, 3L,
3L, 5L, 6L, 6L, 7L, 8L, 8L, 9L, 9L, 11L, 11L, 1L, 2L, 5L,
7L, 10L, 10L, 4L, 0L, 4L, 6L, 3L, 2L, 11L, 11L, 4L, 10L),
year = c(110L, 110L, 110L, 110L, 110L, 110L, 110L, 110L,
110L, 109L, 110L, 110L, 109L, 110L, 110L, 109L, 110L, 109L,
109L, 110L, 109L, 110L, 109L, 110L, 109L, 109L, 109L, 110L,
109L, 110L, 110L, 110L, 109L, 109L, 110L, 109L, 109L, 110L,
109L, 109L), wday = c(4L, 4L, 4L, 5L, 5L, 5L, 5L, 2L, 1L,
4L, 1L, 1L, 3L, 4L, 2L, 3L, 4L, 6L, 2L, 3L, 4L, 5L, 2L, 3L,
1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 5L, 4L, 2L, 1L, 3L, 5L,
2L), yday = c(34L, 34L, 34L, 35L, 35L, 35L, 35L, 39L, 24L,
0L, 31L, 59L, 90L, 90L, 151L, 181L, 181L, 212L, 243L, 243L,
273L, 273L, 334L, 334L, 32L, 60L, 152L, 213L, 305L, 305L,
122L, 3L, 123L, 197L, 97L, 75L, 361L, 341L, 141L, 306L),
isdst = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("sec",
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst"
), class = c("POSIXlt", "POSIXt"), tzone = "GMT")), .Names = c("AccountID",
"PaymentDate"), row.names = c(NA, 40L), class = "data.frame")
dput после выполнения, как вы предложили:
structure(list(AccountID = c(359L, 359L, 359L, 359L, 359L, 359L,
359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L,
359L, 359L, 359L, 359L, 359L, 359L, 359L, 365L, 939L, 939L, 939L,
997L, 997L, 1181L, 1181L, 1181L, 1181L, 1181L, 1181L, 1181L,
1181L, 1181L, 1181L), PaymentDate = structure(c(14245, 14277,
14305, 14335, 14368, 14397, 14426, 14457, 14488, 14518, 14550,
14579, 14613, 14641, 14669, 14700, 14732, 14761, 14791, 14823,
14853, 14883, 14915, 14944, 14442, 14320, 14606, 14707, 14386,
14951, 14293, 14432, 14477, 14540, 14540, 14540, 14540, 14540,
14540, 14551), class = "Date")), .Names = c("AccountID", "PaymentDate"
), row.names = c(10L, 25L, 26L, 13L, 33L, 27L, 16L, 18L, 19L,
21L, 29L, 23L, 32L, 11L, 12L, 14L, 31L, 15L, 17L, 28L, 20L, 22L,
30L, 24L, 34L, 36L, 37L, 35L, 39L, 38L, 45L, 42L, 48L, 50L, 51L,
52L, 53L, 54L, 55L, 40L), class = "data.frame")
вывод необработанных данных
structure(list(AccountID = c(17L, 17L, 17L, 17L, 17L, 17L, 17L,
17L, 17L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L,
359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L, 359L,
359L, 359L, 359L, 359L, 365L, 939L, 939L, 939L, 997L, 997L, 1181L
), PaymentDate = c("04-02-2010", "04-02-2010", "04-02-2010",
"05-02-2010", "05-02-2010", "05-02-2010", "05-02-2010", "09-02-2010",
"25-01-2010", "01-01-2009", "01-02-2010", "01-03-2010", "01-04-2009",
"01-04-2010", "01-06-2010", "01-07-2009", "01-07-2010", "01-08-2009",
"01-09-2009", "01-09-2010", "01-10-2009", "01-10-2010", "01-12-2009",
"01-12-2010", "02-02-2009", "02-03-2009", "02-06-2009", "02-08-2010",
"02-11-2009", "02-11-2010", "03-05-2010", "04-01-2010", "04-05-2009",
"17-07-2009", "08-04-2010", "17-03-2009", "28-12-2009", "08-12-2010",
"22-05-2009", "03-11-2009")), .Names = c("AccountID", "PaymentDate"
), row.names = c(NA, 40L), class = "data.frame")