gpt4 book ai didi

r - 分组 data.fame 后的自定义函数

转载 作者:行者123 更新时间:2023-12-03 05:53:41 25 4
gpt4 key购买 nike

给定以下数据框

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

现在我想在按 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)

括号中是如何计算该值的方式。

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

df %.% 
group_by(l) %.%
mutate(e=myCustomFunction)

但是我应该如何定义myCustomFunction?我认为 data.frame 的分组会产生另一个(子)data.frame,它是该函数的参数。但事实并非如此……

最佳答案

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

df %>%
group_by(l) %>%
mutate(e = v[d == "b"] - v[d == "a"])

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

在 @hadley 发表评论后进行编辑:

正如哈德利在下面评论的那样,在这种情况下最好将函数定义为

f <- function(v, d) v[d == "b"] - v[d == "a"]

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

df %>%
group_by(l) %>%
mutate(e = f(v, d))

感谢@hadley 的评论。

关于r - 分组 data.fame 后的自定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24127237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com