如何知道R中的文本文件中缺少哪一行(日期)?

时间:2015-02-09 10:35:20

标签: r

我有一个文本文件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 

3 个答案:

答案 0 :(得分:3)

尝试:

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]

答案 1 :(得分: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))))

答案 2 :(得分:2)

您可以使用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 = "#")