0

这是我拥有的数据框的一个小示例:

data <- data.frame(station=rep(c(1,1,2),each=4), month=rep(c(2,3,2),each=4), day=rep(c(26:29),3),times=rep(c(1:4),3),place=c(1:8,1:4),V1=rep(9:12,3),V2=rep(9:12,3)) 

这是我需要的数据框:

data1 <- data.frame(station=rep(c(1,1,2),each=4), month=rep(c(2,3,2),each=4), day=rep(c(26:29),3),times=rep(c(1:4),3),place=c(1:8,1:4),V1=c(9,10,10,10,9:12,9,10,10,10),V2=c(9,10,10,10,9:12,9,10,10,10)) 

我需要做的是重复2月28日和29日到2月27日的V1和V2列,因为原始数据有300个站点和60年,我尝试了以下但不起作用:

data1 <- ddply(data, .(station, month, times),function(x) x[x[3:4,2]==2,6:7] <- x[2,6:7])

任何建议将不胜感激,谢谢

4

2 回答 2

0

这本质上是一个“最后的观察结转”问题,因此该zoo软件包很有帮助。28将 2 月th 或th 的所有内容设置为 NA,然后使用 th29结转值27na.locf

library(zoo)
data[c("V1","V2")][data$day %in% c(28,29) & data$month %in% c(2),] <- NA
keyvals <- data[c("V1","V2")][data$day %in% c(27,28,29) & data$month %in% c(2),]
data[c("V1","V2")][data$day %in% c(27,28,29) & data$month %in% c(2),] <- na.locf(keyvals)

结果:

> data
   station month day times place V1 V2
1        1     2  26     1     1  9  9
2        1     2  27     2     2 10 10
3        1     2  28     3     3 10 10
4        1     2  29     4     4 10 10
5        1     3  26     1     5  9  9
6        1     3  27     2     6 10 10
7        1     3  28     3     7 11 11
8        1     3  29     4     8 12 12
9        2     2  26     1     1  9  9
10       2     2  27     2     2 10 10
11       2     2  28     3     3 10 10
12       2     2  29     4     4 10 10

> all.equal(data,data1)
[1] TRUE
于 2013-08-09T04:08:37.437 回答
0

这是你的做法。如果你有很多列,你可以使用lapply,但这里我不使用,因为你只有两个列

data$V1[data[,3] %in% c(28,29) & data[,2] %in% c(2) ]<-data$V1[data[,3] %in% c(27) & data[,2] %in% c(2)]
data$V2[data[,3] %in% c(28,29) & data[,2] %in% c(2) ]<-data$V2[data[,3] %in% c(27) & data[,2] %in% c(2)]

如果您需要使用多个列,这里是解决方案:

   do.call(cbind,lapply(data[,6:7],function (x) {x[data[,3] %in% c(28,29) & data[,2] %in% c(2) ]<-x[data[,3] %in% c(27) & data[,2] %in% c(2)]
                                               x})
          )
      V1 V2
 [1,]  9  9
 [2,] 10 10
 [3,] 10 10
 [4,] 10 10
 [5,]  9  9
 [6,] 10 10
 [7,] 11 11
 [8,] 12 12
 [9,]  9  9
[10,] 10 10
[11,] 10 10
[12,] 10 10

注意:您可以选择要替换的列而不是 data[,6:7],所有其他都保持不变。

于 2013-08-09T02:12:10.840 回答