【发布时间】:2020-03-01 19:02:56
【问题描述】:
让我来描述一下数据:
- abc 和 xyz 是指标。
-
hit 基本上是索引号,例如:
- 命中值3表示abc3和xyz3中对应的值
- hit 4 表示 abc4, xyz4
数据
dat <- data.frame( abc1=c(7, 0, 7),
abc2=c(5, 10, 20),
abc3=c(0, 0, 10),
abc4=c(3, 5, 19),
abc5=c(2, 2, 0),
abc6=c(2, 26, 0),
xyz1=c(0, 2, 0),
xyz2=c(1, 1, 6),
xyz3=c(8, 2, 0),
xyz4=c(6, 3, 5),
xyz5=c(9, 2, 2),
xyz6=c(4, 0, 0),
hit=c(3, 4, 4))
我需要做的是找到命中前和命中后的 abc 和 xyz。 下面的 for 循环可以很好地处理小型数据集,但如果数据超过 100k 行,则循环似乎永远运行。
for (c in c('abc','xyz')){
for (i in 1:nrow(dat)){
for (m in -2:2){
dat[[paste(c,'hit', m)]][i] = dat[i,paste(c, dat$hit[i]-m, sep = "")]
}
}
}
在输出文件中, 第 1 行的 'abc hit 0' 指的是:hit=3,它依次选择 abc3 中的值并分配给 abc hit 0。
abc hit -1 转换为 hit=3-1=2 指向 abc2 和 xyz2
我知道 3 个 for 循环是个坏主意。请通过使用应用函数或任何其他减少执行时间的方式帮助我改进代码。
【问题讨论】:
-
如果您的数据长度(即一个 abc 和一个 xyz 列)不宽且带有后缀列,那么您的过程会容易得多。 Long 可以说是促进聚合、合并、绘图、建模等数据科学的首选格式。
标签: r dataframe for-loop optimization apply