每天我都运行摘要报告,以获取在某个项目输出中导入和使用的文件的列表。每天的日志都标有当天的日期(log.date(,并读取到正在运行的文件日志中。
我想为这个日志创建一个检查,让我知道每天都在读取相同数量的历史文件。(即,今天的导入应该等于昨天的导入,再加上今天的一些新文件。(
示例日志:
fileLog <- data.frame('Log.Date'=c('2020-08-01','2020-08-01','2020-08-02','2020-08-02','2020-08-02','2020-08-03','2020-08-03','2020-08-03','2020-08-03'),
'System' = c('A','B','A','B','C','A','B','C','D'),
'File'=c('file1','file2','file1','file2','file3', 'file1', 'file2','file3','file4'))
# Log.Date System File
# 1 2020-08-01 A file1
# 2 2020-08-01 B file2
# 3 2020-08-02 A file1
# 4 2020-08-02 B file2
# 5 2020-08-02 C file3
# 6 2020-08-03 A file1
# 7 2020-08-03 B file2
# 8 2020-08-03 C file3
# 9 2020-08-03 D file4
我按日志对文件日志进行分组。日期和系统,以获取每天的文件计数,然后调整数据,以便我可以查看和计算前一天的任何更改。我想按位置创建计算:Change="last column"减去"next to last columns",因为列名总是在更改。
fileLog <- fileLog %>%
arrange(Log.Date) %>%
group_by(Log.Date, System) %>%
summarise(File.Count = length(unique(File))) %>%
ungroup() %>%
pivot_wider(names_from = Log.Date, values_from = File.Count) %>%
replace(is.na(.), 0)
fileLog <- as.data.frame(fileLog) %>%
mutate(Change = rev(fileLog)[1] - rev(fileLog)[2])
这确实让我可以查看我正在查找的更改,但是生成的"更改"列属于"data.frame"类。这会导致我在将其作为报表的一部分导出时出现问题。
# System 2020-08-01 2020-08-02 2020-08-03 Change.2020-08-03
# 1 A 1 1 1 0
# 2 B 1 1 1 0
# 3 C 0 1 1 0
# 4 D 0 0 1 1
> class(fileLog$Change)
[1] "data.frame"
使用绝对列名效果良好:
mutate(Change = fileLog$'2020-08-03' - fileLog$'2020-08-02')
我已经尝试了调用该位置的其他迭代,这也解决了同样的问题
mutate(Change = fileLog[,ncol(fileLog)] - fileLog[,ncol(fileLog)-1])
我还尝试过将列强制为数字,给出了错误:不能将"list"对象强制为类型"double">
mutate(Change = as.numeric(check_start[,-1]) - as.numeric(check_start[,-2]))
mutate(Change = as.numeric(rev(check_start)[1]) - as.numeric(rev(check_start)[2]))
问题:有人能提出正确的方法来进行这种位置计算,以输出一个不属于class=data.frame的"Change"列吗?
对上一步的更改很少:
-
使用
n_distinct
代替length(unique(File))
-
代替在
pivot_wider
之后添加另一个replace
步骤,使用values_fill
。
fileLog <- fileLog %>%
arrange(Log.Date) %>%
group_by(Log.Date, System) %>%
summarise(File.Count = n_distinct(File)) %>%
ungroup() %>%
pivot_wider(names_from = Log.Date, values_from = File.Count, values_fill = 0)
现在,要从最后一列和倒数第二列中减去值,可以使用ncol
,它将给出最后一列的列号。
fileLog <- fileLog %>% mutate(Change = .[[ncol(.)]] - .[[ncol(.) - 1]])
fileLog
# A tibble: 4 x 5
System `2020-08-01` `2020-08-02` `2020-08-03` Change
<chr> <int> <int> <int> <int>
1 A 1 1 1 0
2 B 1 1 1 0
3 C 0 1 1 0
4 D 0 0 1 1