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

时间:2019-10-21 10:40:57

标签: r dataframe grouping anonymous-function

说我有一个像这样的数据框:

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)将其应用于{{1 }}列,但不保留数据帧,因此我只取回一个向量(或向量列表)。

2 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分:0)

使用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