分组data.fame后的自定义功能

Jer*_*Who 5 r dataframe dplyr

给出以下data.frame

d <- rep(c("a", "b"), each=5)
l <- rep(1:5, 2) 
v <- 1:10

df       <- data.frame(d=d, l=l, v=v*v)
df
   d l   v
1  a 1   1
2  a 2   4
3  a 3   9
4  a 4  16
5  a 5  25
6  b 1  36
7  b 2  49
8  b 3  64
9  b 4  81
10 b 5 100
Run Code Online (Sandbox Code Playgroud)

现在我想在l分组之后添加另一列.额外列应包含v_b - v_a的值

   d l   v    e
1  a 1   1    35 (36-1)
2  a 2   4    45 (49-4)
3  a 3   9    55 (64-9)
4  a 4  16    65 (81-16)
5  a 5  25    75 (100-25)
6  b 1  36    35 (36-1)
7  b 2  49    45 (49-4)
8  b 3  64    55 (64-9)
9  b 4  81    65 (81-16)
10 b 5 100    75 (100-25)
Run Code Online (Sandbox Code Playgroud)

在paranthesis中如何计算价值的方式.

我正在寻找使用dplyr的方法.所以我从这样的事情开始

df %.% 
 group_by(l) %.%
 mutate(e=myCustomFunction)
Run Code Online (Sandbox Code Playgroud)

但是我该如何定义myCustomFunction?我认为data.frame的分组产生另一个(子)data.frame,它是这个函数的参数.但它不是......

tal*_*lat 14

我想这dplyr相当于@ jlhoward的data.table解决方案:

df %>%
  group_by(l) %>%
  mutate(e = v[d == "b"] - v[d == "a"])
Run Code Online (Sandbox Code Playgroud)

OP评论后编辑:

如果您想使用自定义函数,可以采用以下方法:

myfunc <- function(x) {
  with(x, v[d == "b"] - v[d == "a"])
}

test %>%
  group_by(l) %>%
  do(data.frame(. , e = myfunc(.))) %>%
  arrange(d, l)                   # <- just to get it back in the original order
Run Code Online (Sandbox Code Playgroud)

@hadley评论后编辑:

正如hadley在下面评论的那样,在这种情况下将函数定义为更好

f <- function(v, d) v[d == "b"] - v[d == "a"]
Run Code Online (Sandbox Code Playgroud)

然后在f里面使用自定义函数mutate:

df %>%
  group_by(l) %>%
  mutate(e = f(v, d))  
Run Code Online (Sandbox Code Playgroud)

谢谢@hadley的评论.

  • 最好使函数`f < - function(v,d)v [d =="b"] - v [d =="a"]`然后做`mutate(e = f(v, d))` (3认同)