если заявление с тремя результатами - PullRequest
0 голосов
/ 21 октября 2019

Я хотел бы создать новый столбец, в котором значение зависит от других столбцов. Есть три возможных результата

  1. Расстояние
  2. Расстояние
  3. Расстояние> Max_disp = Max_disp

Я попытался использовать оператор if с несколькими результатами, но получил предупреждение.

Предупреждающие сообщения: 1: In if (Noord_2015_moved $ Distance 1, и будет использоваться только первый элемент 2: In if (Noord_2015_moved $ Distance 1, и будет использоваться только первый элемент

И действительно, он печатает только "Max_disp".

Это код, который я использовал

if (Noord_2015_moved$Distance < Noord_2015_moved$Min_disp) {
  0
} else if (Noord_2015_moved$Distance < Noord_2015_moved$Max_disp) {
  Noord_2015_moved$Distance
} else {
  Noord_2015_moved$Max_disp
}

Я также попытался запустить его в три отдельных шага, но затем я столкнулся с проблемой, которую я не знаю, как сказатьR применить только часть столбца df $, потому что теперь я получаю ошибку

количество заменяемых элементов не кратно длине замены

Noord_2015_moved <- mutate(Noord_2015_moved, Actual_disp = ifelse(Distance < Min_disp, 0, NA))
Noord_2015_moved$Actual_disp[Noord_2015_moved$Distance < Noord_2015_moved$Max_disp] <- Noord_2015_moved$Distance
Noord_2015_moved$Actual_disp[is.na(Noord_2015$Actual_disp)] <- Noord_2015_moved$Max_disp

И это мои данные

'data.frame':   301 obs. of  15 variables:
 $ Transmitter: Factor w/ 18 levels "A69-1601-22313",..: 1 1 1 1 1 1 1 2 2 2 ...
 $ Date       : Date, format: "2015-03-03" "2015-03-08" "2015-03-11" "2015-05-18" ...
 $ Date_time  : Factor w/ 279544 levels "1-03-15 0:00",..: 198302 258702 18684 85140 190788 182641 208718 26315 198759 205744 ...
 $ Receiver   : Factor w/ 17 levels "uitzetpunt 1-noord",..: 8 5 8 5 6 7 6 8 5 8 ...
 $ Station    : Factor w/ 17 levels "10","11","12",..: 15 12 15 12 13 14 13 15 12 15 ...
 $ Traject    : Factor w/ 53 levels "","10-10","10-9",..: 53 50 41 50 40 44 45 53 50 41 ...
 $ Interval   : num  83.4 12.7 42.6 25.2 217.4 ...
 $ Distance   : num  1540 6480 6480 6480 4690 4220 4220 1540 6480 6480 ...
 $ Min_speed  : num  0.02 0.51 0.15 0.26 0.02 0.73 0.52 0.01 0.02 0.02 ...
 $ Min_speed2 : num  0.00556 0.14167 0.04167 0.07222 0.00556 ...
 $ Length     : int  47 47 47 47 47 47 47 45 45 45 ...
 $ Activity   : chr  "Low" "Low" "Low" "Low" ...
 $ Moved      : chr  "Yes" "Yes" "Yes" "Yes" ...
 $ Min_disp   : num  160 4080 1200 2080 160 5840 4160 80 160 160 ...
 $ Max_disp   : num  240 6120 1800 3120 240 8760 6240 120 240 240 ...

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

if() не векторизовано. Он работает на одном условии, а не на целом векторе. Вот что говорит «условие имеет длину> 1, и будет использоваться только первый элемент» . Вы могли бы использовать if() для этой цели, но вам нужно было бы поместить его в цикл for, чтобы проверять каждую строку по одному. Выполнимо, но не эффективно.

ifelse - это векторизованная версия if, и она подходит для такой проблемы, как эта. Для чего-то подобного вы, вероятно, вложите 2 ifelses:

Noord_2015_moved$Actual_disp = ifelse(
  Noord_2015_moved$Distance < Noord_2015_moved$Min_disp, 0, 
  ifelse(Noord_2015_moved$Distance < Noord_2015_moved$Max_disp, Noord_2015_moved$Distance,
    Noord_2015_moved$Max_disp
  ))

Я вижу, у вас есть один mutate. Если вы используете dplyr, вы можете использовать mutate, который добавляет столбец к фрейму данных и означает, что вам не нужно вводить имя фрейма данных для ссылки на существующие столбцы. Этот код эквивалентен моему коду выше:

Noord_2015_moved = Noord_2015_moved %>% mutate(
  Acutal_disp = ifelse(Distance < Min_disp, 0, 
    ifelse(Distance < Max_disp, Distance, Max_disp)
  )
)
1 голос
/ 21 октября 2019

В дополнение к использованию ifelse несколько раз, вы можете использовать dplyr::case_when, который обрабатывает несколько результатов самым чистым способом:

Noord_2015_moved = Noord_2015_moved %>% mutate(
  Acutal_disp = case_when(
    Distance < Min_disp ~ 0,
    Distance < Max_disp ~ Distance,
    Distance > Max_disp ~ Max_disp,
    TRUE ~ NA_real_
  )
)

Вот краткая ссылка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...