说我有一个像这样的数据框:
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 }}列,但不保留数据帧,因此我只取回一个向量(或向量列表)。
答案 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