【发布时间】:2019-01-10 09:54:58
【问题描述】:
我有一个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
因此,对于code 和month 的每个独特组合,我想删除空单元格并折叠数据以使其看起来像上面那样。我需要保留col.f1,因为它可能并不总是空白。
任何建议将不胜感激。
【问题讨论】:
-
我不确定我是否完全理解您的数据结构,使用这样的对角线。此外,您的数据表对
month或code没有任何作用,所以我不确定这些条目应该是什么样子。 -
@Anonymouscoward 这就是数据框中的数据,这只是一个例子。以前都是一栏,更糟糕的是。这肯定是一个混乱的问题,因此发布了这篇文章。我继续将
month和code添加到数据表中。 -
好的,我想我现在明白了,如果我错了,请纠正我。您是否拥有 12 行本质上是一个条目的数据?下一个条目是相同的,但月份为
201407? -
@Anonymouscoward 只要
code的值相同,下一个条目就会相同。month会有所不同,具体取决于数据的排序方式,201407或201405。我可以想象使用by = list(code, month)可以完成一些事情,但我不确定如何实现这一点
标签: r data.table melt