如何重复数据框中的部分行

时间:2013-08-09 01:48:21

标签: r

以下是我所拥有的数据框的一个小例子:

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日的V1和V2列。 29日至2月27日,由于原始数据有300个站点和60年,我试过以下但不起作用:

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

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

2 个答案:

答案 0 :(得分:0)

这是你的表现。如果你有很多cols,你可以使用lapply但在这里我不使用,因为你只有两个cols

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)]

如果你需要使用多个cols,这就是解决方案:

   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

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

答案 1 :(得分:0)

这基本上是“最后一次观察结果”问题,因此zoo包有用。将2月的2829的所有内容设为NA,然后使用27

继承na.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