Измените значение строки на основе другого столбца в DataFrame, используя dplyr - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь заменить значения двух столбцов на основе другого столбца в DataFrame. Я хотел бы использовать dplyr. Пример DataFrame:

df <- data.frame(col1 = c('a', 'b', 'a', 'c', 'b', 'c'),
                 col2 = c(2, 4, 6, 8, 10, 12),
                 col3 = c(5, 10, 15, 20, 25, 30))
df

Я хочу умножить col2 и col3 на 10, если col1 = 'b', и col2 и col 3 на 20, если col1 = 'c'.

Желаемый вывод должен быть следующим:

      col1     col2     col3
1      a        2        5
2      b        40       100
3      a        6        15
4      c        160      400
5      b        100      250
6      c        240      600

Я пытался:

df %>% filter(., col1=='b') %>% mutate(.= replace(., col2, col2*10)) %>% mutate(.= replace(., col3, col3*10))
df %>% filter(., col1=='c') %>% mutate(.= replace(., col2, col2*20)) %>% mutate(.= replace(., col3, col3*20))

Вывод:

Error in replace(., col2, col2*10): object 'col2' not found

Я также пытался:

df %>% mutate_at(vars(col2, col3), funs(ifelse(col1=='b', col2*10, col3*10))
df %>% mutate_at(vars(col2, col3), funs(ifelse(col1=='c', col2*20, col3*20))

Я снова получил ошибку:

funs() is soft deprecated as of dplyr 0.8.0 ...

Может кто-нибудь помочь, пожалуйста? Спасибо:)

1 Ответ

1 голос
/ 23 апреля 2020

Вместо filter ввода и последующего присоединения мы можем напрямую использовать mutate_at с case_when

library(dplyr)
df %>% 
    mutate_at(vars(col2, col3), ~ 
       case_when(col1 == 'b' ~  .* 10, col1  == 'c' ~ .* 20, TRUE  ~ .))
#  col1 col2 col3
#1    a    2    5
#2    b   40  100
#3    a    6   15
#4    c  160  400
#5    b  100  250
#6    c  240  600

Или в dplyr 1.0.0 это можно сделать с помощью mutate/across

df %>%
   mutate(across(c(col2, col3), ~ 
       case_when(col1 == 'b' ~  .* 10, col1  == 'c' ~ .* 20, TRUE  ~ .)))
#  col1 col2 col3
#1    a    2    5
#2    b   40  100
#3    a    6   15
#4    c  160  400
#5    b  100  250
#6    c  240  600
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...