使用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, .)))
还有另一种方法吗?
答案 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