我有一个文本文件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
答案 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 = "#")