我有一个看起来像这样的事务数据库:
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。
使用带有 Posix 时间的 min() 给出第一天, max() 最后一天。这是我需要的每个 ID 的信息。
好的,这是我尝试过的:
# 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'
显然,如果您需要时间聚合而不是按时间聚合,则聚合不适用于 posix 时间。
但是必须可以获取第一个和最后一个交易日期?!
回复
好的,因为我还不能回答我自己的问题,所以我把它贴在这里:
有趣的。谢谢!
我通常将 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”,而aggregate和summaryBy都返回“18286”格式。那是从 1970 年 1 月 1 日开始的日子吗?好吧,我想我可以将其转换回来。
foo=aggregate(PaymentDate ~ AccountID, data1, min)
as.Date(foo$PaymentDate,origin="1970-01-01")
但是,必须有一些解释。此外, ddply 慢得多。
哦,我为什么要先用strptime呢?好吧,原始文件中的日期格式不同,“%d-%m-%y”。直接使用 as.Date 似乎不起作用。
编辑
我的数据的输入
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")