Enr*_*ico 2 r count data.table
我需要根据列值计算与特定行不同的行数,同时避免循环解决方案。
示例:取一个有四行的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
}
}
Run Code Online (Sandbox Code Playgroud)
产生结果:
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
Run Code Online (Sandbox Code Playgroud)
想法如何通过获得相同的结果来避免时间密集型循环?
data.table有一个特殊的符号.EACHI,允许按连接中的每个 i 进行分组。因此,我们可以同时加入和聚合,即使是在非等值自连接中:
A[A, on = .(v1>v1, v2>v2, v3>v3), .N, by = .EACHI]
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)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,请参阅此答案。
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |