R数据帧中多个列的分组依据

时间:2018-11-26 08:48:56

标签: 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

我想按各自的组来计算每个单元格的百分比。

有没有比循环更快的方法了?尺寸真的很大,所以我需要更快的方法。

我的预期结果:

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

2 个答案:

答案 0 :(得分:3)

您可以使用dplyr软件包。

对于一列:

df %>%
group_by(Group) %>%
mutate(A_percent = A / sum(A)) # could use `A` instead of `A_percent`

对于同时几列,您可以执行以下操作,这些操作将按照您的要求覆盖现有列:

df %>%
group_by(Group) %>%
mutate_at(vars(A:D), funs(./sum(.)))

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

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

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

如果您有许多列,则可能需要一种更强大的方法来选择要处理的列。看看the list of select helpers you can use in vars(...)。您也可以简单地使用数字索引。

答案 1 :(得分:2)

使用dplyr,我们可以group_by Group并使用mutate_all来逐列查找所有列的比率。

library(dplyr)
df %>%
  select(-No) %>%
  group_by(Group) %>%
  mutate_all(funs(./sum(.)))


#     A      B      C     D Group
#  <dbl>  <dbl>  <dbl> <dbl> <fct>
#1 0.143 0.214  0.2    0.5   GA   
#2 0.286 0.357  0.6    0.125 GA   
#3 0.571 0.429  0.2    0.375 GA   
#4 0.273 0.0909 0.231  0.4   GB   
#5 0.364 0.818  0.0769 0.4   GB   
#6 0.364 0.0909 0.692  0.2   GB