我遇到了为加权索引创建拼接的问题。我有以下示例数据:
a=(1:10)
b=(14:23)
c=rep(1,10)
wa=c(2,2,2,2,2,6,6,6,6,6)
wb=c(5,5,5,5,5,2,2,2,2,2)
wc=c(3,3,3,3,3,2,2,2,2,2)
z=data.frame(a,b,c,wa,wb,wc)
z$ind=rowSums(z[,1:3]*z[,4:6])/rowSums(z[,4:6])
返回以下数据框:
a b c wa wb wc ind
1 1 14 1 2 5 3 7.5
2 2 15 1 2 5 3 8.2
3 3 16 1 2 5 3 8.9
4 4 17 1 2 5 3 9.6
5 5 18 1 2 5 3 10.3
6 6 19 1 6 2 2 7.6
7 7 20 1 6 2 2 8.4
8 8 21 1 6 2 2 9.2
9 9 22 1 6 2 2 10.0
10 10 23 1 6 2 2 10.8
权重(wa,wb,wc)在记录6时发生了变化。所以我想将索引拼接到记录六,使7.6变为11.我需要用前一记录的权重计算值(a,b,c)并将其除以7.6。然后将其应用于所有后续数字,直到权重再次变化。以下函数允许我找到我的一个权重发生了哪些变化:
changeWeight=function(x){
for(i in 2:NROW(z)) {
z$test[i] <- if(z$wa[i]-z$wa[i-1]==0) 0 else 1
}
z
}
如果重量发生变化,它将返回一个值:
a b c wa wb wc ind test
1 1 14 1 2 5 3 7.5 NA
2 2 15 1 2 5 3 8.2 0
3 3 16 1 2 5 3 8.9 0
4 4 17 1 2 5 3 9.6 0
5 5 18 1 2 5 3 10.3 0
6 6 19 1 6 2 2 7.6 1
7 7 20 1 6 2 2 8.4 0
8 8 21 1 6 2 2 9.2 0
9 9 22 1 6 2 2 10.0 0
10 10 23 1 6 2 2 10.8 0
现在我尝试创建我将乘以的值,以便在索引6处拼接索引。我尝试了以下方法:
spliceValue=function(x){
for(i in 2:NROW(z)){
z$splice[i]=if(z$test[i]==1&z$splice[i-1]!=NA) (rowSums(z[i,1:3]*z[i-1,4:6])/rowSums(z[i-1,4:6]))/z$ind[i] else z$splice[i-1]
}
z
}
但是会返回此错误:
Error in if (z$test[i] == 1 & z$splice[i - 1] != NA) z$ind[i - 1]/z$ind[i] else z$splice[i - :
argument is of length zero
我想得到的是:
a b c wa wb wc ind test splice
1 1 14 1 2 5 3 7.5 NA NA
2 2 15 1 2 5 3 8.2 0 0.000000
3 3 16 1 2 5 3 8.9 0 0.000000
4 4 17 1 2 5 3 9.6 0 0.000000
5 5 18 1 2 5 3 10.3 0 0.000000
6 6 19 1 6 2 2 7.6 1 1.447638
7 7 20 1 6 2 2 8.4 0 1.447638
8 8 21 1 6 2 2 9.2 0 1.447638
9 9 22 1 6 2 2 10.0 0 1.447638
10 10 23 1 6 2 2 10.8 0 1.447638
然后我可以通过拼接来增加ind并获得一个很好的平滑索引。
答案 0 :(得分:1)
扩展示例以使权重有多个更改:
a=(1:15)
b=(14:28)
c=rep(1,15)
wa=c(2,2,2,2,2,6,6,6,6,6,5,5,5,5,5)
wb=c(5,5,5,5,5,2,2,2,2,2,6,6,6,6,6)
wc=c(3,3,3,3,3,2,2,2,2,2,3,3,3,3,3)
z=data.frame(a,b,c,wa,wb,wc)
z$ind=rowSums(z[,1:3]*z[,4:6])/rowSums(z[,4:6])
在这里,我更改了函数changeWeight()
和spliceValue()
以返回可以添加到数据中的向量。这样做可以满足扩展示例的需要,并避免原始函数可能出现的环境问题。
changeWeight<-function(x){
test <- NA
for(i in 2:NROW(z)) {
test[i] <- if(z$wa[i]-z$wa[i-1]==0) 0 else 1
}
return(test)
}
z$test<-changeWeight()
条件z$splice[i - 1]!=NA
似乎是多余的。如果不是,则应考虑!is.na(z$splice[i - 1])
。
spliceValue <- function(x) {
splice <- 0
for(i in 2:NROW(z)) {
splice[i] <- if(z$test[i]==1) (rowSums(z[i,1:3]*z[i-1,4:6])/rowSums(z[i-1,4:6]))/z$ind[i] else splice[i-1]
}
return(splice)
}
z$splice<-spliceValue()
并且,根据原始示例,将z$splice
的第一个值设置为NA,
z$splice[1]<-NA
请注意,如果z
有很多行,这种方法可能需要一段时间。