Итак, позвольте мне описать данные:
- abc и xyz являются метриками.
- hit в основном это индексный номер, например:
- значение попадания 3 означает соответствующее значение в abc3 и xyz3
- попадание 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 хорошо работает для небольших наборов данных, но еслиданные пересекают 100 тыс. строк, цикл выполняется, по-видимому, вечно.
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 = "")]
}
}
}
В выходном файле 'abc hit 0' для строки 1 относится к: hit = 3, который, в свою очередь, выбираетзначение в abc3 и присваивает abc hit 0 .
abc hit -1 переводится в hit = 3-1 = 2, что указывает на abc2 и xyz2
Я знаю, что 3 для циклов - плохая идея. Пожалуйста, помогите мне улучшить код, используя функцию apply или любой другой способ, который сокращает время выполнения.