Изменить оператор IF-Else, используя максимальное значение

#r #if-statement #max #tidyverse #dplyr

#r #if-оператор #макс #tidyverse #dplyr

Вопрос:

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

 ex <- data.frame(EOC = c(1,1,2,2,2),EOC_cnt = c(1,1,1,0,0), pay = c(500,0,200,12,34))
 

чего я хочу, так это:

 ex <- data.frame(EOC = c(1,1,2,2,2),EOC_cnt = c(1,1,1,0,0), pay = c(500,0,200,12,34)),EOC_cnt1 = c(1,0,1,0,0)
 

У меня есть:

 out <- ex %>% group_by(EOC) %>% mutate(EOC_cnt1 = ifelse(EOC_cnt ==1 amp; pmax(pay) , "1", "0"))
 

это работает на этом меньшем примере, но когда я применяю его к своему большему набору данных, я по-прежнему не получаю ни одного 1 на группу EOC. Есть ли какие-либо другие способы, которыми я мог бы получить результат, который я ищу?

(По сути, у меня есть дубликаты в моем столбце EOC_cnt, и я хотел бы создать новый столбец, в котором для каждого EOC есть только один 1)

Вот пример того, где ответ создает все 0:

 dput(ex2)
structure(list(pay = c(342.39, 48.27, 299.96, 274.12, 342.39, 
121.36), EOC = c(1, 1, 1, 1, 1, 1), EOC_cnt = c(0, 1, 0, 0, 0, 
0)), row.names = c(NA, -6L), class = c("data.table", "data.frame"
), .internal.selfref = <pointer: 0x000001cdf95a1ef0>)
 

Ответ №1:

Нам это не нужно ifelse , он может быть преобразован в двоичный с помощью или as.integer

 ex %>% 
    group_by(EOC) %>% 
    mutate(EOC_cnt1 =  (pay == max(pay) amp; EOC_cnt == 1))
 

Если есть дубликаты, то мы используем match их для поиска первого местоположения, где оба являются истинными

 ex %>%
   group_by(EOC) %>%
   mutate(EOC_cnt1 =   (row_number() %in% which(pay == max(pay) amp; EOC_cnt == 1)[1]))
 

Основываясь на новых данных ‘ex2’, неясно, нужно ли нам проверять значение max ‘pay’ только среди элементов, где ‘EOC_cnt’ равно 1. В этом случае подмножьте значение ‘pay’ на основе значения ‘EOC_cnt’ 1, возьмите max и выполните сравнение

 ex2 %>% 
 group_by(EOC) %>% 
 mutate(EOC_cnt2 =  (pay == max(pay[EOC_cnt == 1]) amp; EOC_cnt == 1))
 

Комментарии:

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

2. @vizidea в новом примере оплата не является максимальной, где EOC_cnt равен 1. каков ваш ожидаемый результат

3. @vizidea Мне просто интересно, хотите ли вы ex2 %>% group_by(EOC) %>% mutate(EOC_cnt2 = (pay == max(pay[EOC_cnt == 1]) amp; EOC_cnt == 1))