这dplyr
不仅仅是magrittr
,但我认为它也更具可读性。我有点不舒服,%<>%
因为它破坏了操作的线性结构,并使代码更难阅读。所以我只%>%
在这里使用。
与您的描述匹配的示例数据框:
df <- data.frame(a = 'a',
b = 'b',
x = c("foo", "bar") ,
c = 'c',
d = 'd',
y = 1:6)
df
a b x c d y
1 a b foo c d 1
2 a b bar c d 2
3 a b foo c d 3
4 a b bar c d 4
5 a b foo c d 5
6 a b bar c d 6
你的代码:
library(dplyr)
library(magrittr)
df$y[df$x == "foo"] %<>% subtract(min(.))
df
a b x c d y
1 a b foo c d 0
2 a b bar c d 2
3 a b foo c d 2
4 a b bar c d 4
5 a b foo c d 4
6 a b bar c d 6
df$y[df$x == "bar"] %<>% add(max(df$y[df$x == "foo"]))
df
a b x c d y
1 a b foo c d 0
2 a b bar c d 6
3 a b foo c d 2
4 a b bar c d 8
5 a b foo c d 4
6 a b bar c d 10
一个dplyr
解决方案:
df %>%
mutate(y = ifelse(x == "foo", y - min(y), y)) %>%
mutate(y = ifelse(x == "bar", y + max(y[x == 'foo']), y))
a b x c d y
1 a b foo c d 0
2 a b bar c d 6
3 a b foo c d 2
4 a b bar c d 8
5 a b foo c d 4
6 a b bar c d 10