R 用什么代替';滞后';如果我的数据不是时间序列,而是一大组文本行

R 用什么代替';滞后';如果我的数据不是时间序列,而是一大组文本行,r,lag,R,Lag,我的数据文件是许多具有类似结构的文本文件的合并: 行“新文件的开始” 与文件名一致 “数据线”有两列:域和事件数 每个文件中此类“数据行”的数量可能从0到十万不等 目标是为每一行添加新的列,该列将指示它所涉及的文件名 以下是数据示例: DF <- structure(list(domain = c("START OF NEW FILE", "94_res.txt", "google.ru", "START OF NEW FILE", "95_res.txt", "search-resu

我的数据文件是许多具有类似结构的文本文件的合并:

  • 行“新文件的开始”
  • 与文件名一致
  • “数据线”有两列:域和事件数
  • 每个文件中此类“数据行”的数量可能从0到十万不等 目标是为每一行添加新的列,该列将指示它所涉及的文件名

    以下是数据示例:

     DF <- structure(list(domain = c("START OF NEW FILE", "94_res.txt", 
    "google.ru", "START OF NEW FILE", "95_res.txt", "search-results.com", 
    "hpc.ru", "theadgateway.com", "google.by"), count = c(NA, NA, 
    2L, NA, NA, 2L, 1L, 1L, 6L)), row.names = c(NA, -9L), class = "data.frame")
    
    是因为我的数据不是实时序列吗?或者因为应该添加一些技巧来解决第一行缺少“上一行”的问题?还是别的什么

    另外,所需的输出是这样的smth(fnameRaw只是为了与实际输出进行比较而保留的中间字段)


    lag
    适用于时间序列,但如果使用dplyr,则会有一个
    lag
    适用于数据帧

    1)dplyr/lag我们可以这样使用
    lag

    library(dplyr)
    library(zoo)
    
    DF %>% 
       mutate(filename = ifelse(lag(domain) == "START OF NEW FILE", domain, NA),
         filename = na.locf0(filename),
         filename = ifelse(domain == "START OF NEW FILE", NA, filename))
    
    给予:

                  domain count   filename
    1  START OF NEW FILE    NA       <NA>
    2         94_res.txt    NA 94_res.txt
    3          google.ru     2 94_res.txt
    4  START OF NEW FILE    NA       <NA>
    5         95_res.txt    NA 95_res.txt
    6 search-results.com     2 95_res.txt
    7             hpc.ru     1 95_res.txt
    8   theadgateway.com     1 95_res.txt
    9          google.by     6 95_res.txt
    
    2a)基本R/无滞后此基本解决方案类似于(2)。创建一个向量
    g
    ,每行
    DF
    有一个元素,其元素为1,从新文件的第一行开始,从第二行开始,依此类推。然后定义一个函数
    make_filename
    ,该函数为
    g
    定义的一个组创建
    filename
    列。最后对每组应用
    make_功能
    。没有使用任何软件包

    g <- cumsum(DF$domain == "START OF NEW FILE")
    make_Filename <- function(x) c(NA, rep(x[2], length(x) - 1))
    transform(DF, filename = ave(DF$domain, g, FUN = make_filename))
    

    我以P.S.的形式添加了预期输出。我需要滞后,因为新列的值取决于前一行-它等于前一行中“文件名”列的值,除非前一行的“域”值等于“新文件的开始”。您能以
    dput(test.df)
    格式提供您的输入数据吗?因为@G.Grothendieck已经提供了解决方案,不需要这样做-但是感谢您准备好help@useR,谢谢你的反馈-这对我很有用,因为我是这里的新手。下次我会努力遵守标准
                  domain count   filename
    1  START OF NEW FILE    NA       <NA>
    2         94_res.txt    NA 94_res.txt
    3          google.ru     2 94_res.txt
    4  START OF NEW FILE    NA       <NA>
    5         95_res.txt    NA 95_res.txt
    6 search-results.com     2 95_res.txt
    7             hpc.ru     1 95_res.txt
    8   theadgateway.com     1 95_res.txt
    9          google.by     6 95_res.txt
    
    library(dplyr)
    
    DF %>%
       group_by(g = cumsum(domain == "START OF NEW FILE")) %>%
       mutate(filename = c(NA, rep(domain[2], n()-1))) %>%
       ungroup %>%
       select(-g)
    
    g <- cumsum(DF$domain == "START OF NEW FILE")
    make_Filename <- function(x) c(NA, rep(x[2], length(x) - 1))
    transform(DF, filename = ave(DF$domain, g, FUN = make_filename))
    
    DF <- structure(list(domain = c("START OF NEW FILE", "94_res.txt", 
    "google.ru", "START OF NEW FILE", "95_res.txt", "search-results.com", 
    "hpc.ru", "theadgateway.com", "google.by"), count = c(NA, NA, 
    2L, NA, NA, 2L, 1L, 1L, 6L)), row.names = c(NA, -9L), class = "data.frame")