Строковые операции с mutate_at - PullRequest
4 голосов
/ 03 апреля 2019

Используя 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, .)))

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

Ответы [ 2 ]

4 голосов
/ 03 апреля 2019

Вы можете использовать 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
0 голосов
/ 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
...