将列中的值替换为基于另一列的上一年的值

时间:2019-09-13 22:36:26

标签: r date for-loop if-statement

我想创建一个for循环,根据两列是否匹配,用上一年(同月)的值替换行中的值。

我已经创建了for循环的结构,但是在确定如何获取for循环以引用上一年的值方面尚未取得任何进展。

这是一个示例数据集:

fish <- c("A","A","B","B","C","C")
fish_wt<-c(2,3,4,5,5,7)
fish_count<-c(2,200,47,78,5,845)
date <- as.Date(c('2010-11-1','2009-11-1','2009-11-1','2008-11-1','2008-2-1','2007-2-1'))

data <- data.frame(fish,fish_wt,fish_count,date)
data$newcount<-0

到目前为止,这是我的for循环:

for  (i in 1:nrow(data)) {
  if (data$fish_wt[i] == data$fish_count[i]) {
    data$newcount[i] <- 10
  } else {
    data$newcount[i] <- data$fish_count[i]
  }
}

现在,我使用的是row-1的值,该值适用于此小型数据集,但不适用于较大的记录,因为两条鱼A行不会相邻。

for  (i in 1:nrow(data)) {
  if (data$fish_wt[i] == data$fish_count[i]) {
    data$newcount[i] <- data$newcount[data$date==data$date[i-1])]
 } else {
    data$newcount[i] <- data$fish_count[i]
  }
}

这就是我希望数据集的外观:

      fish    fish_wt  fish_count  date  newcount

1      A          2        2    2010-11-01  200
2      A          3        200  2009-11-01  200
3      B          4        47   2009-11-01  47
4      B          5        78   2008-11-01  78
5      C          5        5    2008-02-01  845
6      C          7        845  2007-02-01  845

我曾想过用鱼将行分开,然后使用row-1解决方案。我只是想知道是否有更简单的事情。

1 个答案:

答案 0 :(得分:0)

为解决此问题,我按鱼,年和月(长格式)设置了平均温度表,然后合并数据集,并使用fish_wt == fish_count的任何行的平均值。