У меня есть фреймворк, состоящий из 3 столбцов и ~ 2000 строк.
ID DistA DistB
1 100 200
2 239 390
3 392 550
4 700 760
5 770 900
Первый столбец (ID) - это уникальный идентификатор для каждой строки. Я бы хотел, чтобы мой сценарий читал каждую строку и вычитал / сравнивал значение из столбца «DistA» в каждой строке из значения столбца «DistB» из предыдущей строки. Если разница расстояний между любыми последующими парами составляет ‹40, вывести, что они находятся в одной области. Например: В приведенном выше примере сравнения строк 2 и 1, «239» из строки 2 и «200» из строки 1 равно ‹40 и, следовательно, находятся в той же области. Таким же образом 2 и 3 находятся в одной области, т.е. разница составляет 2 и 2 ‹40. Но строки 3 и 4 не такие, так как разница в 150.
Мне не удалось уйти далеко, так как я застрял на этапе сравнения (вычитания / разницы). Я попытался написать цикл для перебора всех строк, но продолжаю получать ошибки. Следует ли мне вообще использовать цикл или я могу сделать это без цикла?
Я новичок в R, и это код «новичка», который у меня есть. Где я ошибаюсь. Заранее спасибо:
#the function to compare the two columns
funct <- function(x){
for(i in 1:(nrow(dat)))
(as.numeric(dat$DistA[i-1])) - (as.numeric(dat$DistB[i]))}
#creating a new column 'new2' with the differences
dat$new2 <- apply(dat[,c('DistB','DistA')]),1, funct
Когда я запускаю это, я получаю следующую ошибку:
Error: unexpected ',' in "dat$new2 <- apply(dat[,c('DistB','DistA')]),"
Буду признателен за все комментарии / предложения.
library(dplyr) ; df %>% mutate(Dist = ifelse(abs(DistA - lag(DistB)) < 40, "Same", "Diff"))
- person David Arenburg   schedule 14.03.2015