下面我已经提到了八条数据:
DF_1
Date ID
2017-01-01 12:04:01 AB-1
2017-01-12 22:15:21 AB-2
2017-01-15 18:12:20 AB-3
2017-02-02 17:05:45 AB-4
2017-02-08 19:55:45 AB-5
2017-02-15 13:04:09 AB-6
2017-03-05 20:22:22 AB-7
2017-03-10 14:15:16 AB-8
2017-03-25 19:40:11 AB-9
2017-03-28 21:45:24 AB-10
DF_2
2017-01-01 12:04:01 AB-1
2017-01-12 22:15:21 AB-2
2017-01-15 18:12:20 AB-3
2017-02-02 17:05:45 AB-4
2017-02-08 19:55:45 AB-5
2017-02-15 13:04:09 AB-6
2017-03-05 20:22:22 AB-7
2017-03-10 14:15:16 AB-8
2017-03-25 19:40:11 AB-9
DF_3
2017-01-01 12:04:01 AB-1
2017-01-12 22:15:21 AB-2
2017-01-15 18:12:20 AB-3
2017-02-02 17:05:45 AB-4
2017-02-08 19:55:45 AB-5
2017-02-15 13:04:09 AB-6
2017-03-05 20:22:22 AB-7
2017-03-10 14:15:16 AB-8
2017-03-25 19:40:11 AB-9
DF_4
2017-01-01 12:04:01 AB-1
2017-01-12 22:15:21 AB-2
2017-01-15 18:12:20 AB-3
2017-02-02 17:05:45 AB-4
2017-02-08 19:55:45 AB-5
2017-02-15 13:04:09 AB-6
2017-03-05 20:22:22 AB-7
2017-03-10 14:15:16 AB-8
2017-03-25 19:40:11 AB-9
DF_5
2017-01-01 12:04:01 AB-1
2017-01-12 22:15:21 AB-2
2017-01-15 18:12:20 AB-3
2017-02-02 17:05:45 AB-4
2017-02-15 13:04:09 AB-6
2017-03-05 20:22:22 AB-7
2017-03-10 14:15:16 AB-8
2017-03-25 19:40:11 AB-9
DF_6
2017-01-01 12:04:01 AB-1
2017-01-12 22:15:21 AB-2
2017-01-15 18:12:20 AB-3
2017-02-02 17:05:45 AB-4
2017-02-15 13:04:09 AB-6
2017-03-05 20:22:22 AB-7
2017-03-25 19:40:11 AB-9
DF_7
2017-01-01 12:04:01 AB-1
2017-01-12 22:15:21 AB-2
2017-02-02 17:05:45 AB-4
2017-02-10 13:04:09 AB-6
2017-04-02 20:22:22 AB-7
2017-05-20 19:40:11 AB-9
DF_8
2017-01-01 12:04:01 AB-1
2017-02-12 22:15:21 AB-2
2017-03-02 17:05:45 AB-4
2017-03-15 13:04:09 AB-6
2017-04-05 20:22:22 AB-7
2017-05-25 19:40:11 AB-9使用上面的数据,我想按月创建下面提到的矩阵,其中我们应该考虑第一个数据框架的日期和月份,对于其他数据帧,我们只匹配DF_1。
所需输出
Month DF_1 DF_2 DF_3 DF_4 DF_5 DF_6 DF_7 DF_8
Jan-17 3 3 3 3 3 3 2 2
Feb-17 3 3 3 3 2 2 2 2
Mar-17 4 3 3 3 3 2 2 2 发布于 2018-03-11 12:56:58
一种选择是将数据集放在list中。
lst <- mget(paste0("DF_", 1:8))如果“日期”不是Datetime类,则执行转换
lst <- lapply(lst, transform, Date = as.POSIXct(Date))split 'Date‘列( 'lst1’)中提取的‘月份年’第一个数据集的'ID‘,循环遍历list,检查每个’lst1‘元素中有多少'ID’。
lst1 <- split(DF_1$ID, format(DF_1$Date, "%b-%y"))或者使用来自zoo的zoo
lst1 <- split(DF_1$ID, zoo::as.yearmon(DF_1$Date))
sapply(lst, function(x) sapply(lst1, function(y) sum(x$ID %in% y)))
# DF_1 DF_2 DF_3 DF_4 DF_5 DF_6 DF_7 DF_8
#Jan 2017 3 3 3 3 3 3 2 2
#Feb 2017 3 3 3 3 2 2 2 2
#Mar 2017 4 3 3 3 3 2 2 2或者另一个选项是创建一个命名的vector,然后循环遍历list,匹配'ID‘列,然后获取table
nm1 <- setNames(as.yearmon(DF_1$Date), DF_1$ID)
sapply(lst, function(x) table(nm1[x$ID]))
# DF_1 DF_2 DF_3 DF_4 DF_5 DF_6 DF_7 DF_8
#Jan 2017 3 3 3 3 3 3 2 2
#Feb 2017 3 3 3 3 2 2 2 2
#Mar 2017 4 3 3 3 3 2 2 2如果缺少某些情况,则转换为指定为factor的levels。为了进行测试,删除“DF_8”中的一些行
lst$DF_8 <- lst$DF_8[1:2,]
sapply(lst, function(x) table(factor(nm1[x$ID], levels = as.character(unique(nm1)))))
# DF_1 DF_2 DF_3 DF_4 DF_5 DF_6 DF_7 DF_8
#Jan 2017 3 3 3 3 3 3 2 2
#Feb 2017 3 3 3 3 2 2 2 0
#Mar 2017 4 3 3 3 3 2 2 0https://stackoverflow.com/questions/49220130
复制相似问题