给出以下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)
如果您想使用自定义函数,可以采用以下方法:
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在下面评论的那样,在这种情况下将函数定义为更好
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的评论.