【问题标题】:Transpose or gather wide to long dataframe with multiple keys and values转置或收集具有多个键和值的宽到长数据帧
【发布时间】:2018-09-20 01:24:06
【问题描述】:

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

以下是我的一个小版本。正如您可以想象的那样,后面带有__1 的列会重复直到编号__16 或我的真实数据框中的某些内容。这可以用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

【问题讨论】:

标签: r transpose tidyr data-munging


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我在下面使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      相关资源
      最近更新 更多