dplyr: заменить значение при первом выполнении условия - PullRequest
1 голос
/ 10 октября 2019

Как выполнить следующую базовую операцию в тидиверсе?

res <- data.frame(distr=c(100,200,303,303,200,100),distr2=c(110,210,300,300,190,90)) 
res[which.max(res$distr),"distr2"] <- res[which.max(res$distr),"distr2"] + sum(res$distr)-sum(res$distr2)

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Специально не используются tidyverse функции, но есть один способ сделать это

library(dplyr)

res %>%
  mutate(distr2 = replace(distr2, which.max(distr), 
                distr2[which.max(distr)] + sum(distr) - sum(distr2)))


#  distr distr2
#1   100    110
#2   200    210
#3   303    306
#4   303    300
#5   200    190
#6   100     90

, а есть другой способ

res %>%
    mutate(distr2 = distr2 + (row_number() == which.max(distr)) * 
                             (sum(distr) - sum(distr2)))
1 голос
/ 10 октября 2019

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

res %>% 
  mutate(distr2 = if_else((1:n()) == which.max(distr), 
                          distr2  + sum(distr) - sum(distr2), 
                          distr2))
...