首页 > 解决方案 > 您如何根据每行的唯一子集的函数定义列?

问题描述

在处理时间序列数据时,我在创建列时遇到了一些麻烦。该表具有以下相关列:tijval。我想要做的是创建一个距离加权和的列val,基于具有相同i&t值的观察。如果我使用在变量 ( test_t, test_i, test_j) 中定义的显式值,我可以获得一个单列条目,如下所示:

sum(data[t == test_t & i == test_i & j != test_j
                ][,dist:=sqrt((test_j - j)^2)
                  ][,adjustedVal:=val/dist
                    ][, adjustedVal])

如何将其应用于整个数据表?我的第一个想法是做这样的事情

data[,adjustedVal:=sum(data[i == i, j != j, t == t] #and so on like above

但显然这在范围界定方面存在重大问题。有没有办法确定这个范围,以便我可以在 i(数据中的列)和 i(此表达式中每一行中 i 列的值)之间进行描述?

标签: rdata.table

解决方案


根据标题,我认为您正在寻找

DT[, out :=
    DT[DT, on=.(t, i), by=.EACHI, 
        sum(i.val / abs(i.j - x.j[x.j != i.j]))
    ]$V1
]

样本数据

DT <- data.table(t=c(1,1,1,2,2,2,2), 
    i=c(1,1,1,2,2,2,2), 
    j=c(1,2,3,4,5,6,7),
    val=c(1,2,1,2,3,4,5))

输出:

   t i j val       out
1: 1 1 1   1  1.500000
2: 1 1 2   2  4.000000
3: 1 1 3   1  1.500000
4: 2 2 4   2  3.666667
5: 2 2 5   3  7.500000
6: 2 2 6   4 10.000000
7: 2 2 7   5  9.166667

推荐阅读