【问题标题】:Gather or transpose data with multiple rows as 'key' argument收集或转置多行数据作为“关键”参数
【发布时间】:2018-09-06 07:07:02
【问题描述】:

在我看来,我想tidyr::gather() 不仅收集列名,还收集第 1 行和第 2 行。我想要实现的是拥有一个 5 列和 4 行的数据框。

这是我正在使用的数据集的一小部分:

library(tidyverse)

# A tibble: 4 x 3
  Aanduiding                      `Coolsingel 40 links` `Goudseweg 15 links`
  <chr>                           <chr>                 <chr>               
1 Gebiedsnummer                   1                     2                   
2 Postcode                        3011 AD               3031 XH             
3 Leefbaar Rotterdam              124                   110                 
4 Partij van de Arbeid (P.v.d.A.) 58                    65  

及其可重复使用的dput(df)

df <- structure(list(Aanduiding = c("Gebiedsnummer", "Postcode", "Leefbaar Rotterdam", 
"Partij van de Arbeid (P.v.d.A.)"), `Coolsingel 40 links` = c("1", 
"3011 AD", "124", "58"), `Goudseweg 15 links` = c("2", "3031 XH", 
"110", "65")), row.names = c(NA, -4L), class = c("tbl_df", "tbl", 
"data.frame"), .Names = c("Aanduiding", "Coolsingel 40 links", 
"Goudseweg 15 links"))  

所以想要的输出是这样的:

  Aanduiding                      Gebiedsnummer Postcode adres               value
  <chr>                                   <dbl> <chr>    <chr>               <dbl>
1 Leefbaar Rotterdam                       1.00 3011 AD  Coolsingel 40 links 124  
2 Leefbaar Rotterdam                       1.00 3031 XH  Goudseweg 15 links  120  
3 Partij van de Arbeid (P.v.d.A.)          2.00 3011 AD  Coolsingel 40 links  58.0
4 Partij van de Arbeid (P.v.d.A.)          2.00 3031 XH  Goudseweg 15 links   65.0         

我经常使用tidyr 包中的gather() 函数,但这总是在我只想收集具有特定值的列名时。现在我实际上想收集列名,但还要观察第 1 行和第 2 行。

我可以在多个键上gather 吗?或者将观察 1 和 2 中的值粘贴到列中,然后是 gather(),然后是 separate()

如果可能的话,最好的策略是tidyr 方式。

非常感谢。

【问题讨论】:

  • 输出会是什么样子?请在您的问题中添加。
  • 我编辑了我的问题以显示我想要的输出。
  • @Tdebeus 什么标准/规则以解释的方式划分/排列您的数据? 12411058 等发生了什么?
  • 此外,您的数据如何扩展到此样本之外 - 是否还有更多 Aanduiding 具有相同数量的 adres
  • 我会使用t 转置而不是gather,但这取决于您如何分辨哪些行成为其他行的列...

标签: r transpose tidyr


【解决方案1】:

这里需要做两件事,你必须弄清楚如何相应地分解你的数据集。

data.frame(t(df[1:2,]))

会给你:

                               X1       X2
Aanduiding          Gebiedsnummer Postcode
Coolsingel 40 links             1  3011 AD
Goudseweg 15 links              2  3031 XH

tidyr::gather(df[3:4,],key="adres",value="value",  `Coolsingel 40 links`, `Goudseweg 15 links`)

会给你:

  Aanduiding                      adres               value
  <chr>                           <chr>               <chr>
1 Leefbaar Rotterdam              Coolsingel 40 links 124  
2 Partij van de Arbeid (P.v.d.A.) Coolsingel 40 links 58   
3 Leefbaar Rotterdam              Goudseweg 15 links  110  
4 Partij van de Arbeid (P.v.d.A.) Goudseweg 15 links  65  

如何从那里继续存在另一个问题,可能是基于 adres 的left_join,但这实际上取决于其余数据的结构。

【讨论】:

  • 感谢您的回答,但由于第一个数据框的列名,这两个集合无法连接。没有更好的解决方案吗?
【解决方案2】:

您可以将gatherspread 组合使用几次。当我需要将一个值移出作为计算的分母时,我经常这样做。

library(tidyverse)
...

目标是将GebiedsnummerPostcodeAanduiding 中移出,并将其他两列移到gather 中,并将其移到一列值中。第一个gather 告诉你:

df %>%
  gather(key = address, value = value, -Aanduiding)
#> # A tibble: 8 x 3
#>   Aanduiding                      address             value  
#>   <chr>                           <chr>               <chr>  
#> 1 Gebiedsnummer                   Coolsingel 40 links 1      
#> 2 Postcode                        Coolsingel 40 links 3011 AD
#> 3 Leefbaar Rotterdam              Coolsingel 40 links 124    
#> 4 Partij van de Arbeid (P.v.d.A.) Coolsingel 40 links 58     
#> 5 Gebiedsnummer                   Goudseweg 15 links  2      
#> 6 Postcode                        Goudseweg 15 links  3031 XH
#> 7 Leefbaar Rotterdam              Goudseweg 15 links  110    
#> 8 Partij van de Arbeid (P.v.d.A.) Goudseweg 15 links  65

之后使用spread

df %>%
  gather(key = address, value = value, -Aanduiding) %>%
  spread(key = Aanduiding, value = value)
#> # A tibble: 2 x 5
#>   address    Gebiedsnummer `Leefbaar Rotter… `Partij van de Arbe… Postcode
#>   <chr>      <chr>         <chr>             <chr>                <chr>   
#> 1 Coolsinge… 1             124               58                   3011 AD 
#> 2 Goudseweg… 2             110               65                   3031 XH

然后您想再次gather,但将addressGebiedsnummerPostcode 保留为自己的列。 select 只是为了让列按顺序排列。所以大家一起来:

df %>%
  gather(key = address, value = value, -Aanduiding) %>%
  spread(key = Aanduiding, value = value) %>%
  gather(key = Aanduiding, value = value, -Gebiedsnummer, -address, -Postcode) %>%
  select(Aanduiding, Gebiedsnummer, Postcode, address, value) %>%
  mutate_at(vars(Gebiedsnummer, value), as.numeric)
#> # A tibble: 4 x 5
#>   Aanduiding                 Gebiedsnummer Postcode address          value
#>   <chr>                              <dbl> <chr>    <chr>            <dbl>
#> 1 Leefbaar Rotterdam                     1 3011 AD  Coolsingel 40 l…   124
#> 2 Leefbaar Rotterdam                     2 3031 XH  Goudseweg 15 li…   110
#> 3 Partij van de Arbeid (P.v…             1 3011 AD  Coolsingel 40 l…    58
#> 4 Partij van de Arbeid (P.v…             2 3031 XH  Goudseweg 15 li…    65

reprex package (v0.2.0) 于 2018 年 8 月 24 日创建。

【讨论】:

    猜你喜欢
    • 2018-09-20
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多