R dply收集宽到长的多列多个值

问题描述 投票:0回答:1

我有以下宽格式数据:

identity = c("Race1", "Race2", "Race3")
total_2017 = c(300,325,350)
total_2018 = c(200,225,250)
total_2019 = c(100,150,200)
pct_2017 = total_2017/sum(total_2017[1],total_2018[1],total_2019[1])
pct_2018 = total_2018/sum(total_2017[2],total_2018[2],total_2019[2])
pct_2019 = total_2019/sum(total_2017[3],total_2018[3],total_2019[3])
df.wide <- cbind.data.frame(identity, total_2017, total_2018, total_2019, pct_2017, pct_2018, pct_2019)

宽数据看起来像这样:

     identity total_2017 total_2018 total_2019  pct_2017  pct_2018 pct_2019
1    Race1        300        200        100 0.5000000 0.2857143   0.1250
2    Race2        325        225        150 0.5416667 0.3214286   0.1875
3    Race3        350        250        200 0.5833333 0.3571429   0.2500

[第三,第四和第五列是2017年至2019年的“身份”的总和,最后三列是各自的份额。我想将其转换为长格式,以便将totals收集到列Enrollment中,并将百分比收集到列Percent中。我尝试以下代码:

    library(dplyr)
    library(magrittr)
    library(tidyr)

df.long <- df.wide %>% 
  gather(key = "Total", value = "Enrollment", starts_with("total_")) %>%
  gather(key = "Share", value = "Percent", starts_with("pct_"))

这里是长格式数据的前10行。

    head(df.long, 10)
   identity      Total Enrollment    Share   Percent
1     Race1 total_2017        300 pct_2017 0.5000000
2     Race2 total_2017        325 pct_2017 0.5416667
3     Race3 total_2017        350 pct_2017 0.5833333
4     Race1 total_2018        200 pct_2017 0.5000000
5     Race2 total_2018        225 pct_2017 0.5416667
6     Race3 total_2018        250 pct_2017 0.5833333
7     Race1 total_2019        100 pct_2017 0.5000000
8     Race2 total_2019        150 pct_2017 0.5416667
9     Race3 total_2019        200 pct_2017 0.5833333
10    Race1 total_2017        300 pct_2018 0.2857143

可以看出,注册和百分比的顺序不同。列中的顺序如何?

r dplyr
1个回答
0
投票

这可以通过pivot_longer完成,它可以重塑多组列的形状

library(dplyr)
library(tidyr)
df.wide %>% 
   pivot_longer(cols = -identity, names_to = c('.value', 'group'), names_sep="_")
© www.soinside.com 2019 - 2024. All rights reserved.