Как использовать функцию сравнения R для столбца в кадре данных при условии наличия определенного значения в другом столбце - PullRequest
2 голосов
/ 21 января 2020

Набор данных, с которым я работаю, имеет среднее количество поездок по различным видам транспорта c и в разные годы. Я заинтересован в создании новой колонки, показывающей увеличение среднего пассажиропотока по сравнению с предыдущим годом для каждого вида транспорта c. Код, который я пытался использовать, выглядит следующим образом:

for (i in 1:length(public_trans$type_of_public_transport)) {
  if (public_trans$type_of_public_transport[i] == public_trans$type_of_public_transport[i+1]) {
    ridership_diff[i] <- ifelse(public_trans$average_ridership == 0, 0, public_trans$average_ridership[i+1] - public_trans$average_ridership[i])
    next}}

Код, который я запускаю, выглядит так: «Ошибка в if (public_trans $ type_of_public_transport [i] == public_trans $ type_of_public_transport [i +: отсутствует») значение, в котором требуется значение ИСТИНА / ЛОЖЬ. Дополнительно: было 50 или более предупреждений (используйте предупреждения (), чтобы увидеть первые 50) "

Путем изменения начала l oop с" 1: длина (public_trans) $ type_of_public_transport)) "to" 0: length (public_trans $ type_of_public_transport)) ", ошибка вывода становится такой:" Ошибка в if (public_trans $ type_of_public_transport [i] == public_trans $ type_of_public_transport [i +: аргумент нулевой длины "

Кроме того, даже если мой код работал, я уверен, что есть более простой и прямой способ получить желаемый результат.

1 Ответ

1 голос
/ 21 января 2020

Проблема возникает, когда l oop достигает последней строки, а i + 1 не имеет записи. ОП также упоминал о начале индекса с 0, но индекс R начинается с 1. Опция - l oop, пока последняя строка

for (i in 1:(length(public_trans$type_of_public_transport) - 1)) {
    if (public_trans$type_of_public_transport[i] == 
         public_trans$type_of_public_transport[i+1]) {
 ridership_diff[i] <- ifelse(public_trans$average_ridership[i] == 0, 0, 
      public_trans$average_ridership[i+1] - public_trans$average_ridership[i])
}}

ifelse не будет векторизована, так что нам не нужно все oop здесь

ridership_diff <- with(public_trans,  ifelse(type_of_public_transport[-1] == type_of_public_transport[-nrow(public_trans)] & average_ridership[-nrow(publlic_trans)] == 0,
        0, average_ridership[-1] -average_ridership[-nrow(public_trans)])) 
...