0

我想使用 magrittr、dplyr 和可能的 purrr 的简洁性将一个大型数据帧(具有许多不同类型的变量)拆分为一个变量x,然后有条件地将不同的函数x应用于每个组,并将组内的行应用于第二个变量y

以数据框为例df <- data.frame(a, b, x, c, d, y),其中x因子 ( foo, bar)y是数字。我可以用一个无管道的工作流来做我不雅地描述的事情,因此:

df$y[df$x == "foo"] %<>% subtract(min(.))
df$y[df$x == "bar"] %<>% add(max(df$y[df$x == "foo"]))

我想用 dplyr 重写它并将它添加到一个长管道中,df但是我所有的组合尝试mutate都失败了;尝试将 purrr 与匿名函数合并,以及.sapplydoby_slicedmap

非常感谢您的建议。

4

1 回答 1

2

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
于 2016-05-22T12:34:56.917 回答