计算每一列中各组内总计的百分比并进行转置

卢卢莫克

有没有办法创建以下输出(假设有很多ID和更多属性)?在按ID内的ATT1然后按ATT2等计算总百分比后,我陷入了困境。不知道如何将行变成列标题并进行汇总。

输入文件(R中的df):

ID  ATT1    ATT2    ATT3    ATT4    Value
1      a       x       d       i    10
1      a       y       d       j    10
1      a       y       d       k    10
1      b       y       c       k    10
1      b       y       c       l    10
2      a       x       c       k    20
…               

我希望输出文件看起来像(ATT4_l被切断):

 ID ATT1_a  ATT1_b  ATT2_x  ATT2_y  ATT3_d  ATT3_c  ATT4_i  ATT4_j  ATT4_k   
  1  0.6     0.4     0.2     0.8     0.6     0.4     0.2     0.2     0.4    
 ...

我尝试使用dplyr

df %>% group_by(ID, ATT1) %>% mutate(proc = (Value/sum(Value) * 100))

但是我不确定一旦计算出所有的ATT以将它们分成列并进行汇总,以便每个ID仅包含1行数据,该怎么办。

卡米尔

您可以使用的两个主要工作母机做到这一点tidyversedplyr用于计算和tidyr重塑数据。一些重塑是令人费解的,所以我将其分为几步。

library(dplyr)
library(tidyr)
...

如果您gather将数据从其原始的宽格式转换为长格式,则将有一列ID,一列ATTx值,一列字母(不知道这些内容的上下文含义,所以我的字面意思是它letters),和值的列中。通过这种格式,您可以按ID,ATT和字母的组合对观察值进行分组,然后可以按布局方式将ATT和字母粘在一起。

df %>%
  gather(key = att, value = letter, -ID, -Value) %>%
  head()
#> # A tibble: 6 x 4
#>      ID Value att   letter
#>   <int> <int> <chr> <chr> 
#> 1     1    10 ATT1  a     
#> 2     1    10 ATT1  a     
#> 3     1    10 ATT1  a     
#> 4     1    10 ATT1  b     
#> 5     1    10 ATT1  b     
#> 6     2    20 ATT1  a

分组后,计算每个ID / ATT /字母组合的总值:

df %>%
  gather(key = att, value = letter, -ID, -Value) %>%
  group_by(ID, att, letter) %>%
  summarise(group_val = sum(Value)) %>%
  head()
#> # A tibble: 6 x 4
#> # Groups:   ID, att [3]
#>      ID att   letter group_val
#>   <int> <chr> <chr>      <int>
#> 1     1 ATT1  a             30
#> 2     1 ATT1  b             20
#> 3     1 ATT2  x             10
#> 4     1 ATT2  y             40
#> 5     1 ATT3  c             20
#> 6     1 ATT3  d             30

使用mutate,您可以计算每个观察值在其较大组中的份额。mutate删除分组层次结构的一层,因此这是给定ID和ATT中每个字母的值份额。由于您不再需要总价值,所以只需要共享它们的份额,请删除该列,并将ATT和字母与放在一起unite

df %>%
  gather(key = att, value = letter, -ID, -Value) %>%
  group_by(ID, att, letter) %>%
  summarise(group_val = sum(Value)) %>%
  mutate(share = group_val / sum(group_val)) %>%
  select(-group_val) %>%
  unite(group, att, letter, sep = "_") %>%
  head()
#> # A tibble: 6 x 3
#> # Groups:   ID [1]
#>      ID group  share
#>   <int> <chr>  <dbl>
#> 1     1 ATT1_a   0.6
#> 2     1 ATT1_b   0.4
#> 3     1 ATT2_x   0.2
#> 4     1 ATT2_y   0.8
#> 5     1 ATT3_c   0.4
#> 6     1 ATT3_d   0.6

现在,您拥有了所需的所有信息,只需将其转换为宽格式,然后将group列中的值转换为单独的列即可。您可以这样操作spread

df %>%
  gather(key = att, value = letter, -ID, -Value) %>%
  group_by(ID, att, letter) %>%
  summarise(group_val = sum(Value)) %>%
  mutate(share = group_val / sum(group_val)) %>%
  select(-group_val) %>%
  unite(group, att, letter, sep = "_") %>%
  spread(key = group, value = share)
#> # A tibble: 2 x 11
#> # Groups:   ID [2]
#>      ID ATT1_a ATT1_b ATT2_x ATT2_y ATT3_c ATT3_d ATT4_i ATT4_j ATT4_k
#>   <int>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
#> 1     1    0.6    0.4    0.2    0.8    0.4    0.6    0.2    0.2    0.4
#> 2     2    1     NA      1     NA      1     NA     NA     NA      1  
#> # ... with 1 more variable: ATT4_l <dbl>

请注意,这里没有NA填写ID / ATT /字母组合的注释我假设您将拥有比发布的样本中更完整的数据。

reprex软件包(v0.2.1)创建于2018-10-03

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Pandas:每一列的nan的百分比

按一列分组,然后对另一值列求和,对行进行计数,然后计算R中每个值的百分比

使用group_by查找子组中的百分比并进行汇总

SQL中同一列的百分比

dplyr:计算data.frame中许多列的级别百分比并将其转换为width

在Python中按阈值计算和计算每一列的百分比

使用dplyr计算一列中按组计算的百分比,而忽略空白

分组后获得每一列的百分比

Pandas Group由两列组成,基于一列计算总计,但基于聚合器的总计计算百分比

计算多列总计的百分比

写函数以计算百分比并将其放置在数据框的新列中

Oracle:计算百分比并更新表

Python按一列分组并计算另一列的百分比

使用同一列中的数据计算SQL语句所占的百分比

计算百分比并保留名称

计算百分比并分配给同一数据框中的新列

计算数据集每一列的比例(百分比)

如何使用Pandas Groupby计算每列中总计的百分比

如何计算每一列的百分比?

R如何计算百分比并附加为新列?(示例中的最后两列)

POSTGRES 9.6:如何在单个查询中按表的每一列的百分比进行分解?

如何计算数据集中每个答案的百分比并在括号中显示百分比

基于另一列的列中的Python百分比计算

为 r 中的每一列动态创建百分比

根据另一列计算 groupby 中的百分比

计算数据帧每一列中异常值的百分比

MySql选择总和并计算每列的百分比

如何将百分比列添加到R中数据框中的每一列

计算列值每次出现的百分比并按 ID 分组