Изменить значение столбца на основе другого значения столбца - PullRequest
0 голосов
/ 25 января 2019

Это создает проблемы для меня, я использую dplyr, и я хочу изменить значение каждой недели (от W1 до W3) на основе значения CP: если

      CP             W1              W2              W3             W4
   <dbl>           <dbl>           <dbl>          <dbl>           <dbl>
 1    50               0              60              0               0
 4    10               0               0              0               0
 5    50              20              20             21              50
 6    10               5               0              0              21
 8    10               0              31              0               0

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

     CP             W1              W2              W3             W4 
    <dbl>           <dbl>           <dbl>          <dbl>           <dbl>
1    50               0              60              0               0
4    10               0               0              0               0
5    50               0               0              0              50
6    10               0               0              0              21
8    10               0              31              0               0

Есть ли у вас какие-либо идеи о том, как решить эту проблему с dplyr или другим? Спасибо!

1 Ответ

0 голосов
/ 25 января 2019

Вы можете выбрать mutate_at:

library(dplyr)

df %>%
  mutate_at(vars(starts_with("W")), funs(ifelse(. < CP, 0, .)))

Вывод:

  CP W1 W2 W3 W4
1 50  0 60  0  0
2 10  0  0  0  0
3 50  0  0  0 50
4 10  0  0  0 21
5 10  0 31  0  0

Обратите внимание, что starts_with будет соответствовать любому имени столбца, которое начинается с W.

Если это проблема (например, если у вас есть другие столбцы с этим шаблоном, которые вы не хотите рассматривать), вы также можете использовать matches с регулярным выражением, которое будет учитывать только те W, которые являютсяс последующим номером:

df %>%
  mutate_at(vars(matches("^W[0-9]+")), funs(ifelse(. < CP, 0, .)))
...