我有一个数据框
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循环这很简单但是因为我有一个巨大的数据框,你可能知道任何可以做得更快的函数。 谢谢你的时间。
答案 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)))