R 对数据帧中的组重复应用条件摘要
我有一个大数据框,看起来像这样:R 对数据帧中的组重复应用条件摘要,r,dplyr,data.table,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
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
...
数据帧已按组id
和距离进行排序。我想知道dplyr或data.table的效率相当于执行以下操作:
在每个组中\u id
:
将当前组id
中距离的唯一和排序值设置为d1、d2、…、d_n
对于d1,d2,…,d_n
中的每个d
:对距离值小于d
的所有度量值计算一些函数f
。函数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)
...
请注意如何重复距离
值,如组1
下的值1.1
。在这种情况下,当距离小于1.1
时,应排除这两行(在这种情况下,这将导致空向量) 一种可能的方法是使用data.table
中提供的非等联接。左表是组id和距离的唯一组合集,右表的距离都小于左表的距离
f <- sum
DT[unique(DT, by=c("group_id", "distance")), on=.(group_id, distance<distance), allow.cartesian=TRUE,
f(metric), by=.EACHI]
数据:
库(data.table)
DT不要认为这会比data.table
选项快,但这里有一种方法使用dplyr
library(dplyr)
df %>%
group_by(group_id) %>%
mutate(new = purrr::map_dbl(distance, ~f(metric[distance < .])))
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")
library(dplyr)
df %>%
group_by(group_id) %>%
mutate(new = purrr::map_dbl(distance, ~f(metric[distance < .])))
df %>%
group_by(group_id) %>%
mutate(new = purrr::map_dbl(distance, ~f(metric[distance < .]))) %>%
filter(!duplicated(distance))