r - 在避免循环的同时计算 "smaller"行数比其他行数

我需要根据列值计算与特定行不同的行数,同时避免循环解决方案。

示例:以一个包含四行的data.table对象A为例,每行代表一个人。 每个人都有 3 个值 v1, v2, v3。目标是计算,对于特定的个体(行),有多少其他个体对所有三个变量具有严格更大(或相等)的值,在变量 count 中计数。 完成这项工作的循环版本可能是:

A = data.table(matrix(0,  nrow = 4, ncol = 3))

colnames(A) <- c("v1","v2","v3")

# Assign values for variables v1, v2, v3
A[1,1] <- 1; A[1,2] <- 1; A[1,3] <- 1
A[2,1] <- 1; A[2,2] <- 1.5; A[2,3] <- 1
A[3,1] <- 0.9; A[3,2] <- 0.5; A[3,3] <- 0.8
A[4,1] <- 2; A[4,2] <- 1.5; A[4,3] <- 2

# Count variable 
A$count = NA

for(j in 1:nrow(A)){
  A$count[j] = 0
  A$count[j] = 0    
  for(k in 1:nrow(A)){
    # Compares the value(s) of individual j relatively to individual k
    if( ( A$v1[j] < A$v1[k] ) & ( A$v2[j] < A$v2[k] ) & ( A$v3[j] < A$v3[k] ) ){
      A$count[j] = A$count[j]+1    } # if condition above is fullfilled, add 1 
    
  }
}

产生结果:

    v1  v2  v3 count
1: 1.0 1.0 1.0     1
2: 1.0 1.5 1.0     0
3: 0.9 0.5 0.8     3
4: 2.0 1.5 2.0     0

如何通过获得相同的结果来避免耗时的循环

最佳答案

data.table 有一个特殊的符号 .EACHI 允许在连接中按每个 i 分组。因此,我们可以同时加入和聚合,即使是在非相等自加入中也是如此:

A[A, on = .(v1>v1, v2>v2, v3>v3), .N, by = .EACHI]
    v1  v2  v3 N
1: 1.0 1.0 1.0 1
2: 1.0 1.5 1.0 0
3: 0.9 0.5 0.8 3
4: 2.0 1.5 2.0 0

关于.EACHI更详细的解释,请看this answer。

关于r - 在避免循环的同时计算 "smaller"行数比其他行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69209211/

相关文章:

sql - Postgres - 使用 postgis 计算距离

python - 我如何拆分第二个 ", "

snowflake-cloud-data-platform - 雪花 : How do I upda

python - 在 python 中获取子字符串是 O(n) 操作吗?

javascript - 将存储为 String 的 Array 转换为 Java String 中

node.js - 无效的 ELF header - Argon2 包

c - 在 C 程序中使用汇编函数

c++ - 声明属于所有特化的类模板成员

javascript - 在 Vue 组件中加载 HTML 文件内容

awk - 根据列将大文件拆分为多个文件