有没有办法创建以下输出(假设有很多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行数据,该怎么办。
您可以使用的两个主要工作母机做到这一点tidyverse
:dplyr
用于计算和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] 删除。
我来说两句