我有一个2200万个观测行的数据表,其形式如下:
`dt <- data.table(
firm_id = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2),
metric = c("AN_BILANT", "OPEX", "CAPEX","AN_BILANT","OPEX", "CAPEX", "AN_BILANT", "OPEX", "CAPEX", "AN_BILANT","OPEX", "CAPEX"),
value = c(2013, 10, 3,2014, 11, 5, 2007, 25, 10, 2009, 23, 7)
)`
我想使用data.table生成以下输出
`output_dt <- data.table(
firm_id = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2),
metric = c("OPEX", "CAPEX","OPEX", "CAPEX", "OPEX", "CAPEX", "OPEX", "CAPEX"),
AN_BILANT = c(2013, 2013, 2014, 2014, 2007, 2007, 2009)
value = c( 10, 3,11, 5, 25, 10,23, 7)
)
`
我最初尝试了以下方法:dcast(dt[metric == "AN_BILANT"], firm_id ~ metric, value.var = "value", fun.aggregate = function(x) x)
但我得到了以下错误
错误:聚合函数应接受向量输入并返回单个值(length = 1)。但是,函数返回length!= 1。此值必须用于填充任何缺少的组合,因此必须是length = 1。请通过显式设置"fill"参数来重写,或者修改函数以适当地处理这种情况。
我也试过dcast.data.table(dt[, N:=1:.N, metric], firm_id~metric, subset = (metric=="AN_BILANT") )
我收到警告
缺少聚合函数,默认为"length"
2条答案
按热度按时间mlnl4t2r1#
我喜欢akrun的方法,但是如果数据迫使你选择另一种方法(如果
cumsum
对数据的顺序太敏感),你可以尝试下面的dcast/melt方法.注意,由于firm_id
并不只包含每个metric
中的一个,我们需要临时添加另一个变量,这样我们就不会在初始dcast
时过度减少.诚然,行的顺序是不同的,但双重整形通常不能保证这一点。
p1tboqfb2#
我们可以在按逻辑向量的累积和分组之后,通过分配(
:=
)第一个"值"来创建"AN_BILANT",然后删除这些"AN_BILANT"行