4

使用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

这可以通过 and 来rowwise()实现mutate_at()

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

还有另一种方法可以做到这一点吗?

4

2 回答 2

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
于 2019-04-03T19:11:50.693 回答
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
于 2019-04-03T21:58:53.993 回答