使用多个键和值将宽数据帧转置或收集到长数据帧

Transpose or gather wide to long dataframe with multiple keys and values

我正在尝试将宽数据集转换为长而整洁的数据集。我在这类任务中经常使用 tidyr::gather() 函数,只是现在我有了一个非常奇怪的数据集。

以下是我的小版本。正如您可以想象的那样,在它们后面带有 __1 的列会重复,直到数字 __16 或我的真实 datframe 中的某些内容。这可以用 tidyrdplyr 工具修复吗?

# A tibble: 1 x 10
   code city      party_short party_long           votes seats party_short__1 party_long__1    votes__1 seats__1
  <dbl> <chr>     <chr>       <chr>                <dbl> <dbl> <chr>          <chr>               <dbl>    <dbl>
1  3630 Amsterdam PVDA        Partij van de Arbeid  1833  5.00 HARLBEL        Harlinger Belang       942     2.00 

为了可重复性:

library(tidyverse)

df <- tibble(code = 3630,
        city = "Amsterdam",
        party_short = "PVDA",
        party_long = "Partij van de Arbeid",
        votes = 1833,
        seats = 5,
        party_short__1 = "HARLBEL",
        party_long__1 = "Harlinger Belang",
        votes__1 = 942,
        seats__1 = 2)

具有所需的输出:

# A tibble: 2 x 6
   code city      party_short party_long           votes seats
  <dbl> <chr>     <chr>       <chr>                <dbl> <dbl>
1  3630 Amsterdam PVDA        Partij van de Arbeid  1833  5.00
2  3630 Amsterdam HARLBEL     Harlinger Belang       942  2.00

我们可以将所有的列汇集起来,以“__”分隔列,然后展开数据框。

library(tidyverse)

df2 <- df %>%
  gather(Column, Value, -code, -city) %>%
  separate(Column, into = c("Column", "Number"), sep = "__") %>%
  spread(Column, Value) %>%
  select(-Number)
df2
# # A tibble: 2 x 6
#   code city      party_long           party_short seats votes
#   <dbl> <chr>     <chr>                <chr>       <chr> <chr>
# 1 3630. Amsterdam Harlinger Belang     HARLBEL     2     942  
# 2 3630. Amsterdam Partij van de Arbeid PVDA        5     1833

我在下面使用 data.tabletidyr 的组合

library(data.table)
library(tidyr)

setDT(df)

melt(df, id.vars = c('code', 'city')) %>% separate(variable, c('vv', 'bb'), '__') %>%
  dcast(code + city + bb ~ vv, value.var = 'value') %>% mutate(bb = NULL)

  code      city           party_long party_short seats votes
1 3630 Amsterdam     Harlinger Belang     HARLBEL     2   942
2 3630 Amsterdam Partij van de Arbeid        PVDA     5  1833