ved*_*ved 3 r dplyr data.table
我有一个看起来像这样的大数据框:
group_id distance metric
1 1.1 0.85
1 1.1 0.37
1 1.7 0.93
1 2.3 0.45
...
1 6.3 0.29
1 7.9 0.12
2 2.5 0.78
2 2.8 0.32
...
Run Code Online (Sandbox Code Playgroud)
数据框已按排序group_id,然后按排序distance。我想知道dplyr或data.table等效于执行以下操作:
每个内group_id:
distance当前内 group_idBE d1,d2,...,d_n。d在d1,d2,...,d_n:计算的一些功能f上的所有值metric,其distance值小于d。该函数f是一个自定义的用户定义函数,它接受一个向量并返回一个标量。假设函数f在空向量上定义良好。因此,在上面的示例中,所需的数据帧如下所示:
group_id distance_less_than metric
1 1.1 f(empty vector)
1 1.7 f(0.85, 0.37)
1 2.3 f(0.85, 0.37, 0.93)
...
1 7.9 f(0.85, 0.37, 0.93, 0.45,...,0.29)
2 2.5 f(empty vector)
2 2.8 f(0.78)
...
Run Code Online (Sandbox Code Playgroud)
请注意如何distance重复值,例如1.1group下的值1。在这种情况下,当距离小于时应排除这两行1.1(在这种情况下,这将导致空向量)。
A possible approach is to use non-equi join available in data.table. The left table is the unique set of combinations of group_id and distance and right table are all the distance less than left table's distance.
f <- sum
DT[unique(DT, by=c("group_id", "distance")), on=.(group_id, distance<distance), allow.cartesian=TRUE,
f(metric), by=.EACHI]
Run Code Online (Sandbox Code Playgroud)
output:
group_id distance V1
1: 1 1.1 NA
2: 1 1.7 1.22
3: 1 2.3 2.15
4: 1 6.3 2.60
5: 1 7.9 2.89
6: 2 2.5 NA
7: 2 2.8 0.78
Run Code Online (Sandbox Code Playgroud)
data:
library(data.table)
DT <- fread("group_id distance metric
1 1.1 0.85
1 1.1 0.37
1 1.7 0.93
1 2.3 0.45
1 6.3 0.29
1 7.9 0.12
2 2.5 0.78
2 2.8 0.32")
Run Code Online (Sandbox Code Playgroud)