拼接加权指数

时间:2012-03-26 05:48:37

标签: r

我遇到了为加权索引创建拼接的问题。我有以下示例数据:

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并获得一个很好的平滑索引。

1 个答案:

答案 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有很多行,这种方法可能需要一段时间。