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
假设我有这样一个数据框:
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