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

R使用相对位置从其他列计算新列值。为什么结果列的类=data.frame?,r,R,每天我都运行summary report以获取导入的文件列表,并在特定项目输出中使用这些文件。每天的日志都印有当天的日期(log.date),并被读取到运行日志文件中 我想为这个日志创建一个检查,让我知道从一天到下一天都在读取相同数量的历史文件。(即,今天的导入应等于昨天的导入,再加上今天的一些新文件。) 日志示例: fileLog <- data.frame('Log.Date'=c('2020-08-01','2020-08-01','2020-08-02','2020-08-02',

每天我都运行summary report以获取导入的文件列表,并在特定项目输出中使用这些文件。每天的日志都印有当天的日期(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

使用绝对列名可以很好地工作:

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\u distinct

  • 不要在
    pivot\u wide
    之后添加另一个
    replace
    步骤,而是使用
    values\u fill


  • 应该是双括号的
    [[ncol(.)]
    等吗?是的,你是对的<代码>[仍然将其保留为数据帧。这当然会立即清除它。非常感谢!!考虑是否可以在长格式中执行此操作也可能有价值。使用
    lag
    diff
    或类似函数可以轻松处理日常更改,您可以在组内使用
    groupby
    同样,这个来自前十年的古老问题可能有助于理解与
    [
    [[
    $
    等的所有索引差异-谢谢!我会研究一下滞后和差异,因为我可以看出这在哪里是有用的。否则,关于[,[,$的帖子非常有用。
    mutate(Change = fileLog[,ncol(fileLog)] - fileLog[,ncol(fileLog)-1])
    
      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])) 
    
    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) 
    
    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