【问题标题】:R way to create dataframe from a dataframe columns [duplicate]R从数据框列创建数据框的方法[重复]
【发布时间】:2021-02-03 23:10:17
【问题描述】:

在 R 中寻找一种方法来从另一个数据帧创建数据帧,其中 Col A 的值充当索引,并且 Col B 中的每个唯一值成为新数据帧中的新列,其中 Col C 的值是新列中的值。

数据框 1:

Col A Col B Col C
A 2011 1
B 2012 2
C 2013 3
D 2011 4
E 2012 5
D 2013 6
A 2013 7

结果:

Col A 2011 2012 2013
A 1 0 7
B 0 2 0
C 0 0 3
D 4 0 6
E 0 0 5

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    这是tidyverse 解决方案。

    library(tidyverse)
    
    df1 %>%
      pivot_wider(
        id_cols = Col.A,
        names_from = Col.B,
        values_from = Col.C,
        values_fill = 0L
      )
    ## A tibble: 5 x 4
    #  Col.A `2011` `2012` `2013`
    #  <chr>  <int>  <int>  <int>
    #1 A          1      0      7
    #2 B          0      2      0
    #3 C          0      0      3
    #4 D          4      0      6
    #5 E          0      5      0
    

    数据

    df1 <-
    structure(list(Col.A = c("A", "B", "C", "D", "E", "D", "A"), 
    Col.B = c(2011L, 2012L, 2013L, 2011L, 2012L, 2013L, 2013L), 
    Col.C = 1:7), row.names = c(NA, -7L), class = "data.frame")
    

    【讨论】:

      【解决方案2】:

      这是使用 reshape 的基本 R 选项

      reshape(
        df,
        direction = "wide",
        idvar = "ColA",
        timevar = "ColB"
      )
      

      给了

        ColA ColC.2011 ColC.2012 ColC.2013
      1    A         1        NA         7
      2    B        NA         2        NA
      3    C        NA        NA         3
      4    D         4        NA         6
      5    E        NA         5        NA
      

      data.table 选项与dcast

      > dcast(setDT(df),ColA~ColB, value.var = "ColC")
         ColA 2011 2012 2013
      1:    A    1   NA    7
      2:    B   NA    2   NA
      3:    C   NA   NA    3
      4:    D    4   NA    6
      5:    E   NA    5   NA
      

      数据

      > dput(df)
      structure(list(ColA = c("A", "B", "C", "D", "E", "D", "A"), ColB = c(2011L, 
      2012L, 2013L, 2011L, 2012L, 2013L, 2013L), ColC = 1:7), class = "data.frame", row.names = c(NA, 
      -7L))
      

      【讨论】:

        【解决方案3】:

        我们可以从base R使用xtabs

        xtabs(Col.C ~ Col.A + Col.B, df1)
        

        数据

        df1 <- structure(list(Col.A = c("A", "B", "C", "D", "E", "D", "A"), 
            Col.B = c(2011L, 2012L, 2013L, 2011L, 2012L, 2013L, 2013L
            ), Col.C = 1:7), row.names = c(NA, -7L), class = "data.frame")
        

        【讨论】:

          猜你喜欢
          • 2018-03-15
          • 2016-10-21
          • 2015-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多