r - 如何有条件地总结组中的其他条目 - R
问题描述
在我的数据集中,我有不同项目超时的笛卡尔坐标,由 EventID、event_type、ID 号、x 位置、y 位置、身份类型、广泛类别和框架 ID 号标识。我需要做的是为每个 EventID、event_type 对和框架 ID 号遍历每个 ID 号,并计算具有不同广泛类别的其他 ID 号与当前行的最小距离。我想避免为此使用 for 循环,因为数据集有几百万行长。
我尝试将其公式化为 group_by 并使用 dplyr 汇总调用,但无法完全理解如何在当前行 x 上调用函数,对所有其他 x 和 y 调用 y,然后选择条件最小值。
two_dim_euclid = function(x1, x2, y1, y2){
a <- sqrt((x1 - x2)^2 + (y1 - y2)^2)
return(a)
}
# Example Data
df <- data.frame(stringsAsFactors = FALSE,
EventID = c(1003, 1003, 1003, 1003),
event_type = c(893, 893, 893, 893),
ID_number = c(80427, 2346, 24954, 27765),
x = c(86.07, 72.4, 43.08, 80.13),
y = c(35.58, 26.43, 34.8, 34.79),
identity_type = c("A", "C", "B", "B"),
broad_category = c("set1", "set1", "set2", "set2"),
frame_id = c(1, 1, 1, 1))
df
# EventID event_type ID_number x y identity_type broad_category frame_id
#1 1003 893 80427 86.07 35.58 A set1 1
#2 1003 893 2346 72.40 26.43 C set1 1
#3 1003 893 24954 43.08 34.80 B set2 1
#4 1003 893 27765 80.13 34.79 B set2 1
第 1 行的预期结果将返回 5.992303,它会查找所有不属于 set1 且具有相同 EventID、event_type 和 frame_id 的条目,然后返回给定这些参数的最小欧几里得距离。
此外,我想为每个身份类型为 A 的条目执行此操作。但是,identity_type 和 broad_category 并不总是捆绑在一起。A 可以属于 set1 或 set2。
解决方案
这是依赖于dist()
.
res <- as.matrix(dist(cbind(df$x, df$y)))
res[res == 0] <- Inf
apply(res, 1, min)
1 2 3 4
5.992303 11.386066 30.491299 5.992303
# or potentially more performant
res[cbind(seq_len(nrow(res)), max.col(-res))]
[1] 5.992303 11.386066 30.491299 5.992303
data.table的一种潜在方法是进行笛卡尔连接,但它需要大量内存并且可能会更慢:
library(data.table)
dt <- as.data.table(df)
dt[, ID := .I]
CJ.dt = function(X,Y) {
stopifnot(is.data.table(X),is.data.table(Y))
k = NULL
X = X[, c(k=1, .SD)]
setkey(X, k)
Y = Y[, c(k=1, .SD)]
setkey(Y, NULL)
X[Y, allow.cartesian=TRUE][, k := NULL][]
}
CJ.dt(dt, dt)[ID != i.ID, min(sqrt((x - i.x)^2 + (y-i.y)^2)), by = i.ID]
i.ID V1
1: 1 5.992303
2: 2 11.386066
3: 3 30.491299
4: 4 5.992303
对于 data.table 笛卡尔连接,请参见此处: R: data.table cross-join not working
推荐阅读
- swift - Swift UrlSession SSL CLIENT CERTIFICATE 在 1-2 天后停止工作
- reactjs - 如何从使用状态或其他钩子 React JS 中仅获取一个设置状态函数,
- azure - Azure DevOps 工件目录问题
- python - 向现有的 .CSV/Parquet 文件添加新列,而不先加载整个文件并重新保存?
- julia - 使用多行 LaTeXString 注释 Julia 图
- apache - htaccess - js 和 css 用于缓存但不适用于 webp
- javascript - 执行嵌入命令时出错 discord js
- api - NPM 包 API:如何使用“@”查询包?
- python - 即使我是从 geeksforgeeks 关注的,为什么我的 opencv 错误
- php - 验证:存在两列相同的请求