在R中按组分配权重

时间:2014-05-20 18:21:08

标签: r exponential

我有一个数据框

a  <- seq(1, 1010, 1)
b  <- seq(2,1011,1)
c  <- c(rep(1,253), rep(2, 252), rep(3,254), rep(4,251))
d  <- c(rep(5,253), rep(6, 252), rep(7,254), rep(8,251))
df <- data.frame(a,b,c,d)

我希望按照c和d列对我的样本进行分组,并为每个前250个观测值分配权重,这些观察值呈指数下降,即首次观察群组,例如0.06 *(0.94)^ 250,第二次观察为0.06 *(0.94) ^ 249,第三个0.06 *(0.94)^ 248 .....并且最后一次观察该组(即第250行),其中0.06 * 0.94 ^ 0。

使用for循环这很简单但是因为我有一个巨大的数据框,你可能知道任何可以做得更快的函数。 谢谢你的时间。

2 个答案:

答案 0 :(得分:3)

我不知道有任何内置函数可以直接执行此操作。因此,我会按如下方式处理:

df$weights <- NA_real_ # # a new column
sapply(split(1:nrow(df), paste(df$c, df$d)), function(i) {
   df$weights[i[1:251]] <<- 0.06*0.94^(250:0)
})

首先,我们将数据框分成对应于c&amp; d的组。重要的是,对于每个组,我们只想获取属于它的行号i。然后我们计算前251个元素的权重。可以应用一些简单的调整,以便当每个组中的元素数量小于251时,此解决方案可以正常工作。

答案 1 :(得分:2)

dplyr方法:

require(dplyr)

df <- df %.%
  group_by(c,d) %.%
  filter(1:n() <= 250) %.%
  mutate(weight = 0.06*(0.94)^(seq(249,0,-1)))