Построчные операции с mutate_at

Используя dplyr, есть ли способ выборочно изменять столбцы по строкам без использования rowwise()?

Например, учитывая приведенный ниже ввод, я хочу заменить отрицательные числа нулями в столбцах с префиксом «pre_»:

df <- data.frame(a=c(-5, 3, 4, 5), b=4:1, pre_c=c(-1, -5, 3, 10), pre_d=c(-6, 5, -12, 0))
#    a b pre_c pre_d
# 1 -5 4    -1    -6
# 2  3 3    -5     5
# 3  4 2     3   -12
# 4  5 1    10     0

Мой желаемый результат:

#    a b pre_c pre_d
# 1 -5 4     0     0
# 2  3 3     0     5
# 3  4 2     3     0
# 4  5 1    10     0

Этого можно добиться с помощью rowwise() и mutate_at():

df %>% 
   rowwise() %>% 
   mutate_at(vars(starts_with("pre_")), funs(max(0, .)))

Есть ли другой способ сделать это?


person Megatron    schedule 03.04.2019    source источник


Ответы (2)


Вы можете использовать pmax (или replace) без rowwise

library(dplyr)
df %>% 
  mutate_at(vars(starts_with("pre_")), list(~pmax(0, .)))
   a b pre_c pre_d
1 -5 4     0     0
2  3 3     0     5
3  4 2     3     0
4  5 1    10     0

Использование base R

df[startsWith(names(df), "pre_")][df[startsWith(names(df), "pre_")] < 0] <- 0
person markus    schedule 03.04.2019

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

df %>%
 mutate_at(vars(starts_with("pre_")), list(~ (. > 0) * .))

   a b pre_c pre_d
1 -5 4     0     0
2  3 3     0     5
3  4 2     3     0
4  5 1    10     0
person tmfmnk    schedule 03.04.2019