我想取一列数值数据,在这种情况下绑定在0到10之间,并在迭代的基础上减去一个固定值。在我目前的范例中,每列代表一个时间步长,并且取决于之前的时间步长(t-1)。这种依赖很重要,因为我想定义数字重置为10的列,然后再次开始降级。我的主要问题是对于大型数据集来说这是非常低效的,我相当确定有一种更快,更可扩展的方法来完成这项任务。
df <- data.frame(matrix(data=0,nrow=10,ncol=10))
df[,1] <- data.frame(runif(10,0,10))
df[c(3,5,7),4] <- 10
degradation <- .16
for (year in 2:10){
df[,year][df[,year]!=10] <- df[,year-1][df[,year]!=10]-degradation
}
df[df<0]<-0
这是一个非常简单且效率低下的示例,说明了我希望数据的外观。我可能会陷入旧的excel思维方式,所以如果有必要,我愿意采用不同的方式构建数据。
谢谢!
答案 0 :(得分:0)
数据是矩阵,所以不要使用数据框
m <- matrix(data=0, nrow=10, ncol=10)
m[,1] <- runif(10, 0, 10)
m[c(3,5,7), 4] <- 10
避免使用变量(ridx
)复制计算来表示中间值;使用二维子集赋值
degradation <- .16
for (year in 2:10) {
ridx <- m[, year] != 10
m[ridx, year] <- m[ridx, year-1L] - degradation
}
如果想法是有一个恒定的复位率 r ,那么在一段时间后任何一行都有概率 p0 = r 刚刚重置, p1 =(1 - r ) r 在1个时间段内重置, p2 =(1 - r )^ 2 r 重置2个时间段之前,..., pt =(1 - r )^ t r 重置 t 时间段之前(这描述了几何分布)。相应的值为 x0 = 10, x1 = 10 - d , x2 = 10 - 2 d ,..., xt = 10 - td 。在 t = 10 / d 时间段之后,如果没有复位则该值为0.因此,例如样本非零的概率是sum_ {i = 0} ^ {i = 10 / d-1} pi并且非零行的平均值是sum_ {i = 0} ^ {i = 10 / d-1} pi xi。无需模拟即可轻松计算出这些(以及10 ... 0中各个状态的概率)。