如何根据每行的唯一子集函数定义列?
How do you define a column based on a function of a unique subset for each row?
我在处理时间序列数据时创建列时遇到了一些问题。 table 具有以下相关列:t
、i
、j
和 val
。我想要做的是根据具有相同 i
和 t
值的观察创建一个列,该列是 val
的距离加权和。如果我使用在变量 (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])
如何将其应用于整个数据 table?我的第一个想法是做这样的事情
data[,adjustedVal:=sum(data[i == i, j != j, t == t] #and so on like above
但显然这在范围界定方面存在重大问题。有没有一种方法可以限定它的范围,以便我可以在 i(数据中的列)和 i(此表达式中每一行中第 i 列的值)之间划定?
根据标题,我认为您正在寻找
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
我在处理时间序列数据时创建列时遇到了一些问题。 table 具有以下相关列:t
、i
、j
和 val
。我想要做的是根据具有相同 i
和 t
值的观察创建一个列,该列是 val
的距离加权和。如果我使用在变量 (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])
如何将其应用于整个数据 table?我的第一个想法是做这样的事情
data[,adjustedVal:=sum(data[i == i, j != j, t == t] #and so on like above
但显然这在范围界定方面存在重大问题。有没有一种方法可以限定它的范围,以便我可以在 i(数据中的列)和 i(此表达式中每一行中第 i 列的值)之间划定?
根据标题,我认为您正在寻找
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