R语言 使用data.table中列的值对长数据表进行子集化,并强制转换其他值

yrdbyhpb  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(147)

我有一个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"

mlnl4t2r

mlnl4t2r1#

我喜欢akrun的方法,但是如果数据迫使你选择另一种方法(如果cumsum对数据的顺序太敏感),你可以尝试下面的dcast/melt方法.注意,由于firm_id并不只包含每个metric中的一个,我们需要临时添加另一个变量,这样我们就不会在初始dcast时过度减少.

library(data.table)
dcast(DT[, grp := seq_len(.N), by = .(firm_id, metric)],
      firm_id + grp ~ metric, value.var = "value")[, grp := NULL] |>
  melt(c("firm_id", "AN_BILANT"), variable.name = "metric")
#    firm_id AN_BILANT metric value
#      <num>     <num> <fctr> <num>
# 1:       1      2013  CAPEX     3
# 2:       1      2014  CAPEX     5
# 3:       2      2007  CAPEX    10
# 4:       2      2009  CAPEX     7
# 5:       1      2013   OPEX    10
# 6:       1      2014   OPEX    11
# 7:       2      2007   OPEX    25
# 8:       2      2009   OPEX    23

诚然,行的顺序是不同的,但双重整形通常不能保证这一点。

p1tboqfb

p1tboqfb2#

我们可以在按逻辑向量的累积和分组之后,通过分配(:=)第一个"值"来创建"AN_BILANT",然后删除这些"AN_BILANT"行

library(data.table)
dt[, AN_BILANT :=  value[1], cumsum(metric == 'AN_BILANT')][
    metric != 'AN_BILANT']
  • 输出
firm_id metric value AN_BILANT
1:       1   OPEX    10      2013
2:       1  CAPEX     3      2013
3:       1   OPEX    11      2014
4:       1  CAPEX     5      2014
5:       2   OPEX    25      2007
6:       2  CAPEX    10      2007
7:       2   OPEX    23      2009
8:       2  CAPEX     7      2009

相关问题