如何使用R中的多个数据帧以月为单位创建矩阵

Rah*_*hah 0 r ggplot2 dataframe dplyr

我在下面提到了八个数据帧:

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
Run Code Online (Sandbox Code Playgroud)

使用上面的数据帧我想逐月创建下面提到的矩阵,我们应该只考虑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    
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

一种选择是将数据集放在一个 list

lst <- mget(paste0("DF_", 1:8))
Run Code Online (Sandbox Code Playgroud)

如果'Date'不是Datetime类,请进行转换

lst <- lapply(lst, transform, Date = as.POSIXct(Date))
Run Code Online (Sandbox Code Playgroud)

split第一个数据集的"ID"由"日期"列('lst1')中提取的"月 - 年"循环list,检查每个"lst1"元素中有多少"ID"

lst1 <- split(DF_1$ID, format(DF_1$Date, "%b-%y"))
Run Code Online (Sandbox Code Playgroud)

或者使用as.yearmonzoo

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
Run Code Online (Sandbox Code Playgroud)

或者另一个选择是创建一个名为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
Run Code Online (Sandbox Code Playgroud)

如果某些情况下丢失,然后再转换到factorlevels指定.为了测试,删除'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
Run Code Online (Sandbox Code Playgroud)