首页 > 解决方案 > 将长表转换为宽格式,仅计算一列

问题描述

我有一个如下所示的长格式表,该输入表中的每一行都是唯一的:-

 year variable
  2014   ab  
  2014   cd  
  2014   ef 
  2016   ef 
  2016   gh
  2014   ab  
  2014   cd  
  2014   ef 
  2016   ef 
  2016   gh

我想将此表转换为宽格式,但仅适用于variable看起来像列联矩阵的列。例如 - 如下输出表所示,ab+cd 的组合在 2014 年出现 ONCE,ab+ef 组合在 2014 年也出现 ONCE。这样,我的输出表的第一行清楚地显示所有不同年份的输入表的Counts不同组合variable列。

year    value  ab  cd  ef  gh  
2014    ab     2    2   2   0
2014    cd     2    2   2   0 
2014    ef     2    2   2   0 
2014    ef     0    0   2   2 
2016    gh     0    0   2   2 

我曾多次尝试重塑表格,但未能达到我想要的结果。如果解决方案包括使用data.table. 谢谢你。

标签: rdplyrdata.tablereshape2dcast

解决方案


这是使用的选项data.table

vs <- DT[, unique(variable)]
for (x in vs) set(DT, j=x, value=0L)
DT[, (vs) := {
        m <- as.matrix(.SD)
        m[, match(variable, vs)] <- 1L
        as.data.table(m)
    }, year, .SD=vs]
DT

并且:

DT[, (vs) := {
        m <- copy(.SD)
        m[, match(variable, vs)] <- 1L
        m
    }, year, .SD=vs]

根据问题描述输出(正如 Daniel O 和 meriops 所指出的,期望的输出和问题描述之间存在一些不一致):

   year variable ab cd ef gh
1: 2014       ab  1  1  1  0
2: 2014       cd  1  1  1  0
3: 2014       ef  1  1  1  0
4: 2016       ef  0  0  1  1
5: 2016       gh  0  0  1  1

数据:

library(data.table)
DT <- fread("year variable
2014   ab  
2014   cd  
2014   ef 
2016   ef 
2016   gh")

推荐阅读