首页 > 解决方案 > 使用 by 重塑 data.table

问题描述

我有一个data.table我想要的数据以对角线方式构造的地方。

library(data.table)
month <- c(201406, 201406, 201406, 201406, 201406, 201406, 201406, 201406, 
201406, 201406, 201406, 201406)
code <- c("498A01", "498A01", "498A01", "498A01", "498A01", "498A01", "498A01", "498A01", 
"498A01", "498A01", "498A01", "498A01")
col.a <- c("service", "base charge", "", "", "", "", "", "", "", "", "", "")
col.b <- c("", "", "description", "per unit", "", "", "", "", "", "", "", "")
col.c <- c("", "", "", "", "rate", 6859, "", "", "", "", "", "")
col.d <- c("", "", "", "", "", "", "quantity", 1, "", "", "", "")
col.e <- c("", "", "", "", "", "", "", "", "total charge", 6859, "", "")
col.f <- c("", "", "", "", "", "", "", "", "", "", "", "")   
dt <- data.table(month, code, col.a, col.b, col.c, col.d, col.e, col.f)

但是,我需要以更连贯的方式组织数据以简化dt 我还很陌生data.table,我想知道是否有一种直接的方法可以做到这一点。

因为col.a我知道以下内容适用于一列:

dt <- dt[col.a != "", 1:8, by = .(code, month)

但是当我尝试多列时,它会返回一个 0 obs 的数据表。我想我可以对所有列都这样做,然后进行某种合并,但这似乎效率低下且麻烦。有没有更好的办法?

我想要的输出是:

   month   code      col.a      col.b     col.c   col.d       col.e    col.f
1: 201406 498A01     service description   rate quantity total charge       
2: 201406 498A01 base charge    per unit   6859        1         6859 

因此,对于 和 的每个独特组合,codemonth想删除空单元格并折叠数据以使其看起来像上面那样。我需要保留它,col.f1因为它可能并不总是空白。

任何建议将不胜感激。

标签: rdata.tablemelt

解决方案


你在寻找类似的东西

dt[, lapply(.SD, function(x) x[x!=""][1:2]), by=.(month, code)]

输出:

    month   code       col.a       col.b col.c    col.d        col.e col.f
1: 201406 498A01     service description  rate quantity total charge  <NA>
2: 201406 498A01 base charge    per unit  6859        1         6859  <NA>

或者在基础 R 中:

do.call(rbind, by(dt, paste(dt$month, dt$code), 
    function(y) do.call(cbind, lapply(y, function(x) x[x!=""][1:2]))))

输出:

     month    code     col.a         col.b         col.c  col.d      col.e          col.f
[1,] "201406" "498A01" "service"     "description" "rate" "quantity" "total charge" NA   
[2,] "201406" "498A01" "base charge" "per unit"    "6859" "1"        "6859"         NA   

推荐阅读