R 按一列分组并将自定义函数应用于另一列

R group by one column and apply custom function to another column

假设我有这样一个数据框:

x <- data.frame(x = c(rep("A", 5), rep("B", 5), rep("C", 5)), Data = rep(1:5, 3))

如何将此函数应用于每个组 A、B 和 C 的第二(数字)列?:

Percent <- function(x){(x/length(x))*100}

所以结果是这样的:

x Data
 A 20
 A 40
 A 60
 A 80
 A 100
 B 20
 B 40
 ...etc

我已经尝试了 aggregate()dplyr 中的各种方法,但是 a) 代码想要将函数应用于两列,导致错误,或者 b) 它将它应用于 Data 列,但不保留数据框,所以我只取回一个向量(或向量列表)。

使用 dplyr,您可以:

fun <- function(x) {
 (x/n()) * 100
}

x %>%
 group_by(x) %>%
 mutate(Data = fun(Data))

   x      Data
   <fct> <dbl>
 1 A        20
 2 A        40
 3 A        60
 4 A        80
 5 A       100
 6 B        20
 7 B        40
 8 B        60
 9 B        80
10 B       100

使用data.table:

代码

setDT(dt)

dt = data.table(x); percent = function(x){100*x/length(x)}
dt[, Percent := percent(Data), keyby=x]

结果

> dt
    x Data Percent
 1: A    1      20
 2: A    2      40
 3: A    3      60
 4: A    4      80
 5: A    5     100
 6: B    1      20
 7: B    2      40
 8: B    3      60
 9: B    4      80
10: B    5     100
11: C    1      20
12: C    2      40
13: C    3      60
14: C    4      80
15: C    5     100