R 数据框中多列的百分比分组依据

Bha*_*ata 3 r dataframe

我有一个如下所示的数据框结构:

No    A    B    C    D    Group
=========================
1    2    3    1    4    GA
2    4    5    3    1    GA
3    8    6    1    3    GA
4    6    1    3    2    GB
5    8    9    1    2    GB
6    8    1    9    1    GB
Run Code Online (Sandbox Code Playgroud)

我想按各自的组计算每个细胞的百分比。

有没有比循环更快的方法?尺寸确实很大,所以我需要一种更快的方法。

我的预期结果:

No    A      B       C       D    Group
=======================================
1    2/14    3/14    1/5     4/8    GA
2    4/14    5/14    3/5     1/8    GA
3    8/14    6/14    1/5     3/8    GA
4    6/22    1/11    3/13    2/5    GB
5    8/22    9/11    1/13    2/5    GB
6    8/22    1/11    9/13    1/5    GB
Run Code Online (Sandbox Code Playgroud)

asa*_*ica 7

您可以使用该dplyr包。

对于一列:

df %>%
group_by(Group) %>%
mutate(A_percent = A / sum(A)) # could use `A` instead of `A_percent`
Run Code Online (Sandbox Code Playgroud)

同时对于多个列,您可以执行以下操作,这将根据您的要求覆盖现有列:

df %>%
group_by(Group) %>%
mutate_at(vars(A:D), funs(./sum(.)))
Run Code Online (Sandbox Code Playgroud)

请注意,如果您想创建新列而不是覆盖,您可以这样做:

df %>%
group_by(Group) %>%
mutate_at(vars(A:D), funs("percent" = ./sum(.)))
Run Code Online (Sandbox Code Playgroud)

这将创建带有“_percent”后缀的新列。

如果您有很多列,您可能需要一种更强大的方法来选择要处理的列。查看可以在 中使用的选择帮助器列表 vars(...)。您也可以简单地使用数字索引。