R使用相对位置计算其他列的新列值.为什么结果列的类=data.frame

  • 本文关键字:结果 frame data 新列值 位置 相对 计算 其他 r
  • 更新时间 :
  • 英文 :


每天我都运行摘要报告,以获取在某个项目输出中导入和使用的文件的列表。每天的日志都标有当天的日期(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"列吗?

对上一步的更改很少:

  1. 使用n_distinct代替length(unique(File))

  2. 代替在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

相关内容

最新更新