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

标签 r dataframe dplyr

给定以下数据框

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/

相关文章:

r - 在 R 中进行子集化时是否需要包含 `which` 或者我可以进行逻辑测试吗?

r - 将整数转换为 base36

r - ggplot2:每个 bin 中因子的单级分数的条形图

r - 访问r的mutate函数中的所有未知列

r - 对代码块使用 magic.wand 函数

R中的滚动窗口模式更新

r - 无法连接 data.table 结果来自 R 中的 foreach 循环

python - 查找包含子字符串的列并替换它 - Pandas

r - 当只有一位数字与R不同时的数据转换

python - 如何计算 Pandas 中每一列的每日平均值?