以下是我所拥有的数据框的一个小例子:
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])
任何建议都将不胜感激,谢谢
答案 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月的28
或29
的所有内容设为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