【问题标题】:Pivoting a Dataframe in R在 R 中旋转数据框
【发布时间】:2018-09-05 07:06:33
【问题描述】:

假设我有一个数据框,其中包含多个作为因子的列和一个感兴趣的列 colA。

例如,假设数据框如下所示:

colA | colB | colC | colD
--------------------------
  1  |  'a' |  1   |  2 
  1  |  'b' |  2   |  3
  4  |  'b' |  2   |  4
  2  |  'a' |  3   |  1
  3  |  'a' |  2   |  6
  3  |  'b' |  1   |  6

我想根据 colA 的 group-by 来总结每一列,但以某种方式构造它,以便 colB、colC、colD 的值分布在行上,而 colA 的值分布在列。也就是说,当 colA 的值为 1 时,当 colA 的值为 2 时,我想要 colB 值的计数(每个 colB 的值一行),依此类推。 colC 和colD 相同。生成的数据框如下所示:

        colA_value1 | colA_value2 | colA_value3 | colA_value4
        -----------------------------------------------------
colB_a |     1      |      1      |      1      |      0
colB_b |     1      |      0      |      1      |      1
colC_1 |     1      |      0      |      1      |      0
colC_2 |     1      |      0      |      1      |      1
colC_3 |     0      |      1      |      0      |      0
colD_1 |     0      |      1      |      0      |      0
colD_2 |     1      |      0      |      0      |      0
colD_3 |     1      |      0      |      0      |      0
colD_4 |     0      |      0      |      0      |      1
colD_6 |     0      |      0      |      2      |      0

优先使用 tidyverse 软件包。

【问题讨论】:

  • 如果您提供一个您已经尝试过的可重现示例,那么回答您的问题会容易得多。也许您的示例数据框带有dput(my_data),这样人们就可以复制粘贴而不是再次构建您的数据。
  • @alistaire 酷! :)

标签: r dataframe pivot


【解决方案1】:

reshape2melt() + dcast()

library(reshape2)

df <- read.table(header=TRUE, text='colA | colB | colC | colD
              1  |  a |  1   |  2
              1  |  b |  2   |  3
              4  |  b |  2   |  4
              2  |  a |  3   |  1
              3  |  a |  2   |  6
              3  |  b |  1   |  6', sep='|')

df2 <- melt(df, id.vars = 'colA')
df2$value <- trimws(df2$value)
df2$colA <- paste('colA_value', df2$colA, sep='')
df2$variable_value <- paste(df2$variable, df2$value, sep='_')
dcast(df2, variable_value~colA, fun=length)

#   variable_value colA_value1 colA_value2 colA_value3 colA_value4
#1          colB_a           1           1           1           0
#2          colB_b           1           0           1           1
#3          colC_1           1           0           1           0
#4          colC_2           1           0           1           1
#5          colC_3           0           1           0           0
#6          colD_1           0           1           0           0
#7          colD_2           1           0           0           0
#8          colD_3           1           0           0           0
#9          colD_4           0           0           0           1
#10         colD_6           0           0           2           0

【讨论】:

    【解决方案2】:

    这可以通过大量的 tidyr 来完成:

    library(tidyverse)
    
    df <- data.frame(colA = c(1L, 1L, 4L, 2L, 3L, 3L), 
                     colB = c("a", "b", "b", "a", "a", "b"), 
                     colC = c(1L, 2L, 2L, 3L, 2L, 1L), 
                     colD = c(2L, 3L, 4L, 1L, 6L, 6L))
    
    df %>% 
        gather(key, value, colA) %>% 
        unite(colA, key, value) %>% 
        gather(key, value, -colA) %>% 
        unite(col, key, value) %>% 
        count(colA, col) %>% 
        spread(colA, n, fill = 0)
    #> Warning: attributes are not identical across measure variables;
    #> they will be dropped
    #> # A tibble: 10 x 5
    #>    col    colA_1 colA_2 colA_3 colA_4
    #>    <chr>   <dbl>  <dbl>  <dbl>  <dbl>
    #>  1 colB_a      1      1      1      0
    #>  2 colB_b      1      0      1      1
    #>  3 colC_1      1      0      1      0
    #>  4 colC_2      1      0      1      1
    #>  5 colC_3      0      1      0      0
    #>  6 colD_1      0      1      0      0
    #>  7 colD_2      1      0      0      0
    #>  8 colD_3      1      0      0      0
    #>  9 colD_4      0      0      0      1
    #> 10 colD_6      0      0      2      0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      • 2022-11-15
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2017-05-04
      • 2019-11-14
      相关资源
      最近更新 更多