R 检查月份中的天数,修复缺少的值

R 检查月份中的天数,修复缺少的值,r,R,我需要检查我的天气数据集中的所有月份,以确保每个站点每天都有值。如果天不见了,或者有-9999天,那么我只想用平均数。在我的原始代码中,我将实际使用最近的气象站,但出于测试目的,我只使用该月的平均值 我正在寻找一种更有效的方法来编码这个问题。如何使此代码更高效?这看起来像是一个黑客的工作,但我不知道另一种方法来做它。如果有任何建议,我将不胜感激 dput: df这里有一个解决方案,使用一点dplyr 首先,通过将年、月和日列粘贴在一起,我们创建了一个date列 然后我们制作一个数据帧,序列从最小

我需要检查我的天气数据集中的所有月份,以确保每个站点每天都有值。如果天不见了,或者有-9999天,那么我只想用平均数。在我的原始代码中,我将实际使用最近的气象站,但出于测试目的,我只使用该月的平均值

我正在寻找一种更有效的方法来编码这个问题。如何使此代码更高效?这看起来像是一个黑客的工作,但我不知道另一种方法来做它。如果有任何建议,我将不胜感激

dput:


df这里有一个解决方案,使用一点
dplyr

首先,通过将年、月和日列粘贴在一起,我们创建了一个
date

然后我们制作一个数据帧,序列从最小日期到最大日期

然后,我们合并这两个数据,以将缺少的天数添加到您的数据中:

df$date <- as.Date(paste0(df$year, "-", df$month, "-", df$day))
tomerge <- data.frame(date = seq(min(df$date), max(df$date), "days"))
newdat <- merge(tomerge, df, by = "date", all.x = TRUE)

我并不真正了解你的代码在这里发生了什么,但我通常使用
seq
来列举所有的日期,然后在此基础上进行合并,在
seq
中的日期留下
NA
,但不在原始数据中。我也不确定你到底在做什么,因为你表达问题的方式不清楚。但它可能是重复的:谢谢你的回答,但我只是检查了一下,它没有修复-9999或填写丢失的日期。请注意,缺少第20天和第27天,第15天为-9999。这修复了-9999,但插入的天数现在为NA。知道吗?这就快到了<代码>错误:找不到函数“year”
如何填写id、元素和日期?我喜欢
dplyr
,这个解决方案非常完美。我使用
tidyr::fill(id,element)
mutate(day=day(date))
。如果您缺少月初数据,
tidyr::fill
将中断-您可以查看
tidyr::complete
# Get number of days in month
c_month <- paste0(df[1,3], "-", df[1,4], "-01" )
n_month <- paste0(df[1,3], "-", as.numeric(1+df[1,4]), "-01")
days <- as.numeric(difftime( as.Date(n_month), as.Date(c_month) ))
days_count <- as.numeric(1:days)


# Check df for number of days
n_days <- nrow(df)
n_days_count <- as.numeric(df$day)

# Find differences
diff <- setdiff(days_count, n_days_count)
miss <- which(df$value == -9999)

# If -9999 exists, replace with mean
if (length(miss >= 1)) {
  check <- filter(df, value != -9999)
  df[miss,7] = mean(check$value)
}

# If days are missing, insert with mean  
if (n_days < days){
  for (i in 1:length(diff)){
    add_df <- df[1,]
    add_df$day <- diff[i]
    add_df$date <- paste0(add_df$year, add_df$month, diff[i])
    add_df$value <- mean(check$value)
    df <- rbind(df, add_df)
  }
}
df$date <- as.Date(paste0(df$year, "-", df$month, "-", df$day))
tomerge <- data.frame(date = seq(min(df$date), max(df$date), "days"))
newdat <- merge(tomerge, df, by = "date", all.x = TRUE)
library(dplyr)
library(lubridate)

newdat %>% mutate(value = ifelse(value == -9999, NA, value)) %>%
           group_by(year = year(date), month = month(date)) %>%
           mutate(value = ifelse(is.na(value), mean(value, na.rm=TRUE), value))