【问题标题】:pivot and count membership of two variables [duplicate]枢轴和计算两个变量的成员资格[重复]
【发布时间】:2017-02-19 23:55:47
【问题描述】:

我在 R 中有一个如下所示的数据框:

df1 <- data.frame(id = letters[seq( from = 1, to = 20 )],
                  var1 = sample(1:5,20,replace=T),
                  var2 = sample(1:5,20,replace=T))

这里var1var2是1到5之间的分类变量。

我想创建一个矩阵,其中列标题为 var1 1 到 5,行标题为 var2 1 到 5,并且该矩阵由属于每个组的条目数的计数填充.

我尝试过使用reshape,查看了lazyeval 包,发现与this 类似的问题,但我找不到任何符合要求的问题。

【问题讨论】:

  • 请添加您的预期输出。此外,请使用set.seed 以获得可重复性。
  • 试试table(df1[-1])

标签: r dataframe


【解决方案1】:

使用来自 reshape2 的 dcast

df1 %>% reshape2::dcast(var2~var1)
reshape2::dcast(df1,var2 ~ var1)

【讨论】:

    【解决方案2】:
    library(dplyr)
    library(tidyr)
    
    set.seed(1)
    
    df1 <- data.frame(id = letters[seq( from = 1, to = 20 )],
                      var1 = sample(1:5,20,replace=T),
                      var2 = sample(1:5,20,replace=T))
    
    df1
    
    #    id var1 var2
    # 1   a    2    5
    # 2   b    2    2
    # 3   c    3    4
    # 4   d    5    1
    # 5   e    2    2
    # 6   f    5    2
    # 7   g    5    1
    # 8   h    4    2
    # 9   i    4    5
    # 10  j    1    2
    # 11  k    2    3
    # 12  l    1    3
    # 13  m    4    3
    # 14  n    2    1
    # 15  o    4    5
    # 16  p    3    4
    # 17  q    4    4
    # 18  r    5    1
    # 19  s    2    4
    # 20  t    4    3
    
    
    df1 %>%
      count(var1,var2) %>%                     # count how many times you have each combination
      ungroup %>%
      mutate(var1 = paste0("var1_",var1)) %>%  # update variable values
      spread(var1,n, fill=0) %>%               # reshape dataset
      mutate(var2 = paste0("var2_",var2)) %>%  # update variable values
      print() -> df2
    
    # # A tibble: 5 × 6
    #     var2 var1_1 var1_2 var1_3 var1_4 var1_5
    #    <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
    # 1 var2_1      0      1      0      0      3
    # 2 var2_2      1      2      0      1      1
    # 3 var2_3      1      1      0      2      0
    # 4 var2_4      0      1      2      1      0
    # 5 var2_5      0      1      0      2      0
    

    如果您真的更喜欢将 var2 值作为行名而不是​​列名,请添加此

    df2 = data.frame(df2)
    row.names(df2) = df2$var2
    df2$var2 = NULL
    
    df2
    
    #        var1_1 var1_2 var1_3 var1_4 var1_5
    # var2_1      0      1      0      0      3
    # var2_2      1      2      0      1      1
    # var2_3      1      1      0      2      0
    # var2_4      0      1      2      1      0
    # var2_5      0      1      0      2      0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多