R按矢量和日期重复行

时间:2013-04-04 18:33:03

标签: r

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

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

1 个答案:

答案 0 :(得分:0)

我写了一些与你的例子做同样事情的代码,但可能你必须为了处理整个数据集而对它进行修改。我不知道如何处理最后一次观察。最后我为它做了一个特例。如果它应该按不同的数字划分,您只需要用{0}替换8内的values <- c(values, tail(data$value, 1) / 8) 。此外,如果你在一个data.frame中拥有所有275个工作站,我认为最好的想法是拆分它,单独转换它而不是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)

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