【问题标题】:How to know which line (date) is missing in a text file in R?如何知道 R 中的文本文件中缺少哪一行(日期)?
【发布时间】:2015-02-09 10:35:20
【问题描述】:

我有一个文本文件dat,其中包含 2008-2009 两年的数据(每日值)。总行数是 730,但应该是 731(因为 2008 有 366)所以缺少一个日期(线)。我想知道我怎样才能知道缺少哪个日期? 每天应该有一行(行)

文件:

head(dat)
     Year day   valu 
61322 2008   1    0.301 
61346 2008   2    0.285 
61370 2008   3    0.272 
61394 2008   4    0.253 

【问题讨论】:

    标签: r


    【解决方案1】:

    试试:

    dfDate = with(dat, as.Date(day, origin="2008-01-01"))
    
    yearDates = seq(as.Date("2008-01-01"),as.Date("2009-12-31"), by="days")
    
    yearDates[!yearDates %in% dfDate]
    

    【讨论】:

      【解决方案2】:

      这非常复杂。但也许我在这里犯了一个逻辑错误,还有一个更直接的解决方案。

      首先,一些助手:

      days_in_year = function (year)
          1 : (if (is_leap_year(year)) 366 else 365)
      
      is_leap_year = function (year)
          year %% 4 == 0 && (year %% 100 != 0 || year %% 400 == 0)
      

      现在我们可以生成每年的完整天数列表,并查看这些天数是否都存在于您的data.frame

      years = c(2008, 2009)
      years = setNames(years, years)
      full_years = lapply(years, days_in_year)
      
      missing_days = lapply(years, function (y) which(is.na(match(full_years[[as.character(y)]], subset(dat, Year == y)$day))))
      

      【讨论】:

        【解决方案3】:

        你可以用count.fields()统计文件中的字段

        txt <- "Year day   valu 
        61322 2008   1    0.301
        
        61370 2008   3    0.272 
        61394 2008   4    0.25"
        

        我们可以使用skip = 1 将起始行设置为2,这样标题行就不会出现在结果中,而blank.lines.skip = FALSE 可以取回任何空白行(显示为零)。您可以通过取 4 的差异来发现任何其他差异。

        (cf <- count.fields(textConnection(txt), skip = 1, blank.lines.skip = FALSE))
        # [1] 4 0 4 4
        which(cf == 0)
        # [1] 2
        

        所以现在您可以推断缺少的日期可能在第二行。在您的情况下,在文件上运行 count.fields() 应该会告诉您缺少的行在哪里。

        count.fields("file.dat", skip = 1, blank.lines.skip = FALSE)
        

        还有其他有用的参数

        > args(count.fields)
        function (file, sep = "", quote = "\"'", skip = 0, blank.lines.skip = TRUE, 
            comment.char = "#") 
        

        【讨论】:

        • 这表明 that 行丢失(OP 已经知道),而不是 which 行丢失,除非恰好在代替缺失行的输入。
        • 它们是按顺序排列的,所以你可以推断出哪些是缺失的== 0
        • 对,假设缺失记录的位置应该有一个空行。
        • 对,但您也可以查找字段数量的差异。如果缺少日期但该行的其余部分存在,我们将看到 3 而不是 4(减去标题行)
        • 我仍然不相信这会帮助 OP,因为我假设他有一个完整的表格,只是删除了一个完整的行)但这是一种非常有趣的技术,我不知道,所以绝对是一个有用的答案。
        猜你喜欢
        • 2014-02-06
        • 1970-01-01
        • 1970-01-01
        • 2013-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        相关资源
        最近更新 更多