我需要根据列值计算与特定行不同的行数,同时避免循环解决方案。
示例:以一个包含四行的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/