使用mutate_at进行逐行运算

时间:2019-04-03 18:57:27

标签: r dplyr rowwise

使用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 个答案:

答案 0 :(得分:4)

您可以在没有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

答案 1 :(得分:0)

您也可以尝试:

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