我在下面提到了八个数据帧:
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
的日期和月份,而我们仅匹配ID
的其他数据框。
所需输出
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
答案 0 :(得分:5)
一种选择是将数据集放在list
lst <- mget(paste0("DF_", 1:8))
如果'Date'不是Datetime类,请进行转换
lst <- lapply(lst, transform, Date = as.POSIXct(Date))
split
第一个数据集的“ID”,在“日期”列('lst1')中提取的“月 - 年”,循环遍历list
,检查'ID中有多少' '每个'lst1'元素都有
lst1 <- split(DF_1$ID, format(DF_1$Date, "%b-%y"))
或使用as.yearmon
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 0