【问题标题】:Spread data based on multiple key variables基于多个关键变量传播数据
【发布时间】:2019-01-03 10:35:30
【问题描述】:

我的数据:

df <- as.data.frame(cbind(Bilagstoptekst = c("A", "A", "A", "B", "B", "C", "D", "E", "E", "F", "F", "F", "F", "F"), 
              AKT=c("80", "80", "80", "80", "80", "25", "80", "80", "80", "80", "80", "25", "25", "80"), 
              IArt=c("HUVE", "HUVE", "HUVE", "HUVE", "HUBO", "BILÅ", "HUBO", "HUVE", "HUVE", "HUBO", "HUVE", "BILÅ", "BILÅ", "HUBO" ),
              Belob=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14)))

> df
Bilagstoptekst AKT IArt Belob
A               80 HUVE     1
A               80 HUVE     2
A               80 HUVE     3
B               80 HUVE     4
B               80 HUBO     5
C               25 BILÅ     6
D               80 HUBO     7
E               25 HUVE     8
E               80 HUVE     9
F               80 HUBO    10
F               80 HUVE    11
F               25 BILÅ    12
F               25 BILÅ    13
F               80 HUBO    14

现在,我喜欢为 Bilagstoptekst、AKT 和 IArt 组合的每个键展开我的 Belob 列。

输出数据应该是这样的:

Bilagstoptekst AKT IArt Belob1 Belob2 Belob3 
A               80 HUVE     1     2      3
B               80 HUVE     4    NA     NA
B               80 HUBO     5    NA     NA
C               25 BILÅ     6    NA     NA
D               80 HUBO     7    NA     NA
E               80 HUVE     8     9     NA
F               80 HUBO    10    14     NA
F               80 HUVE    11    NA     NA
F               25 BILÅ    12    13     NA

现在,我已经尝试过使用 spread 和 dcast,但我就是无法让它发挥作用。

在我的真实数据集中,我有数千行,所以这只是示例数据。

【问题讨论】:

    标签: r spread dcast


    【解决方案1】:

    这是一种使用来自data.tabledcast 的方法

    library(data.table)
    dt <- as.data.table(df)
    dt[, idx := rowid(Bilagstoptekst, AKT, IArt)] # creates the timevar
    out <- dcast(dt, 
                 Bilagstoptekst + AKT + IArt ~ paste0("Belob", idx),
                 value.var = "Belob")
    out
    #   Bilagstoptekst AKT IArt Belob1 Belob2 Belob3
    #1:              A  80 HUVE      1      2      3
    #2:              B  80 HUBO      5   <NA>   <NA>
    #3:              B  80 HUVE      4   <NA>   <NA>
    #4:              C  25 BILÅ      6   <NA>   <NA>
    #5:              D  80 HUBO      7   <NA>   <NA>
    #6:              E  80 HUVE      8      9   <NA>
    #7:              F  25 BILÅ     12     13   <NA>
    #8:              F  80 HUBO     10     14   <NA>
    #9:              F  80 HUVE     11   <NA>   <NA>
    

    这里重要的是我们创建的列idx,它在我们重塑您的数据时用作“时间变量”。


    base R 你需要这样做

    df$idx <- with(df, ave(Belob, Bilagstoptekst, AKT, IArt, FUN = seq_along))
    reshape(df, idvar = c("Bilagstoptekst", "AKT", "IArt"), timevar = "idx", direction = "wide")
    

    tidyverse 方法留作练习 ;)


    不确定您的问题是否与Transpose / reshape dataframe without “timevar” from long to wide format 重复。

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 1970-01-01
      • 2019-12-09
      • 2016-03-29
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多