【问题标题】:R repeat rows by vector and dateR按向量和日期重复行
【发布时间】:2013-04-04 18:33:02
【问题描述】:

我有一个数据框,其中包含 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

【问题讨论】:

    标签: r


    【解决方案1】:

    我编写了一些与您的示例执行相同操作的代码,但可能您必须修改它才能处理整个数据集。我不确定如何处理最后一次观察。最后我为它做了一个特殊的案例。如果要除以不同的数字,您只需将values <- c(values, tail(data$value, 1) / 8) 内的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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 2018-02-01
      • 2015-12-05
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      相关资源
      最近更新 更多