Как добавить группирующую переменную в набор данных, который будет классифицировать как наблюдение, так и его N соседей на основе некоторого условия - PullRequest
0 голосов
/ 10 мая 2019

У меня возникли проблемы с поиском решения, которое правильно обрабатывает классификацию переменного числа соседей для любого данного наблюдения в кадре данных на основе некоторого условия. Я хотел бы иметь возможность добавить простую двоичную переменную индикатора во фрейм данных, которая будет равна 1, если условие выполнено, и 0, если это не так.

Когда я застреваю, я не уверен, как итеративно проверять условие только по соседним наблюдениям, в любом направлении (то есть, чтобы проверить, если из 4 соседних наблюдений в данном столбце в моем фрейме данных, по крайней мере, 3 из 4 из них содержат одинаковое значение). Я попытался сначала создать другую переменную индикатора, указывающую, выполнено ли условие или нет (1 или 0 = да или нет). Затем я попытался установить серию ifelse() операторов в цикле, чтобы попытаться назначить правильную категоризацию наблюдения, где выполняется начальное условие, +/- 2 наблюдения в любом направлении. Однако, когда я проверяю кадр данных после выполнения цикла, только само наблюдение (не его соседи), где выполняется условие, получает значение, а не все соседние наблюдения, также получающие значение. Вот мой код:

#sample data
sample_dat <- data.frame(initial_ind = c(0,1,0,1,0,0,1,1,0,1,0,0))

sample_dat$violate <- NULL
for(i in 1:nrow(dat_date_ord)){
  sample_dat$violate[i] <- ifelse(sample_dat$initial_ind[i]==1 &
                                         ((sample_dat$initial_ind[i-2]==1 |
                                             sample_dat$initial_ind[i-1]==1) &
                                            (sample_dat$initial_ind[i+2]==1 |
                                               sample_dat$initial_ind[i+1]==1)),
                                       "trending",
                                       "non-trending"
  )
}


Этот цикл правильно идентифицирует одну из четырех точек, которые должны быть помечены как "трендовые", но он также не назначает "трендовые" правильным соседям. Другими словами, я ожидаю, что результат будет "трендовым для наблюдений 7-10, так как все 3/4 наблюдений в этой группе из 4 имеют значение 1 в столбце исходного индикатора. Мне кажется, что может быть более простой способ Выполните это, но мне нужно убедиться, что мой код достаточно устойчив, чтобы идентифицировать и назначать наблюдения группе, независимо от того, хочу ли я 3/4 для обозначения группы, 5/6, 2/5 и т. д.

Спасибо за любые советы.

1 Ответ

0 голосов
/ 10 мая 2019

Вы можете использовать функцию rollapply из пакета zoo, чтобы применить функцию для установки интервалов в ваших данных. Тогда возникает вопрос о создании функции, которая удовлетворяет вашим потребностям. Я не уверен, правильно ли я понял, но, похоже, вам нужна функция, которая проверяет, выполняется ли условие по крайней мере для 3/5 наблюдения плюс его четырех ближайших соседей. В этом случае просто добавьте 1 и убедитесь, что они выше 2.

library(zoo)

sample_dat <- data.frame(initial_ind = c(0,1,0,1,0,0,1,1,0,1,0,0))

trend_test = function(x){
  ifelse(sum(x) > 2, "trending", "non-trending")
}

sample_dat$violate_new = rollapply(sample_dat$initial_ind, FUN = trend_test, width = 5, fill = NA)

Редактировать: Если вам нужна функция, которая проверяет, имеют ли наблюдение и следующие 3 наблюдения хотя бы 3 1 с, вы можете сделать что-то очень похожее, просто изменив аргумент align в rollapply:

trend_test_2 = function(x){
  ifelse(sum(x) > 2, "trending", "non-trending")
}

sample_dat$violate_new = rollapply(sample_dat$initial_ind, FUN = trend_test_2, width = 4, 
  fill = NA, align = "left")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...