1

我有一个包含 275 个不同站点和 43 年季节性数据(10 月到次年 4 月,不需要 5 月到 9 月的数据)和 6 个变量的数据框,这是一个只有一个名为 value 的变量的数据框的小示例:

data <- data.frame(station=rep(1,6), year=rep(1969,6), month=c(10,10,10,10,11,11),day=c(1,8,16,24,1,9),value=c(1:6))   

我需要的是用每日日期(例如:1:8)和每行的值填充 8 天的平均值,它看起来像:

data1 <- data.frame(station=rep(1,40), year=rep(1969,40), month=c(rep(10,31),rep(11,9)),day=c(1:31,1:9),value=rep(c(1/7,2/8,3/8,4/8,5/8,6/8),c(7,8,8,8,8,1)))    

我写了一些糟糕的代码并在网站上搜索,但不幸的是没有成功,请帮助或更好的想法将不胜感激。

station.date <- as.Date(with(data, paste(year, month, day, sep="-")))
for (i in 1:length(station.date)){
  days <- as.numeric(station.date[i+1]-station.date[i])   #not working
  data <- within(data, days <- c(days,1))  
} 
rows <- rep(1:nrow(data), times=data[ ,data$days])
rows <- ifelse(rows > 10, 0, rows)     #get rid of month May to Sept
data <- data[rows, ] 
data <- within(data, value1 <- value/days)       
data <- within(data, dd <- ?)    #don't know to change the repeated days to real days
4

1 回答 1

0

我编写了一些与您的示例执行相同操作的代码,但可能您必须修改它才能处理整个数据集。我不确定如何处理最后一次观察。最后我为它做了一个特殊的案例。如果它应该除以不同的数字,你只需要用那个数字替换8里面。values <- c(values, tail(data$value, 1) / 8) 此外,如果您将所有275站点都放在一个 data.frame 中,我认为最好的办法是将其拆分、单独转换,而不是 cbind。

data <- data.frame(station=rep(1,6), year=rep(1969,6), month=c(10,10,10,10,11,11),day=c(1,8,16,24,1,9),value=c(1:6)) 

station.date <- as.Date(with(data, paste(year, month, day, sep="-")))
d <- as.numeric(diff(station.date))
range <- sum(d) + 1

# create dates
dates <- seq(station.date[1], by = "day", length = range)

# create values
values <- unlist(sapply(1:length(d), function(i){
   rep(data$value[i] / d[i] , d[i])
}))
# adding last observation
values <- c(values, tail(data$value, 1) / 8)

# create new data frame
data2 <- data.frame(station = rep(1, range), 
                    year = as.numeric(format(dates, "%Y")),
                    month = as.numeric(format(dates, "%m")),
                    day = as.numeric(format(dates, "%d")),
                    value = values)

它可能会以某种方式进行优化,但我希望它也有帮助。请注意我如何从日期中提取年、月和日。

于 2013-04-04T21:42:00.373 回答