【发布时间】:2021-03-29 16:48:51
【问题描述】:
我有一个数据框 dt,其中有两个变量,如下所示。使用下面的代码,我想得到矩阵 G。
V1 V2
1 60
1 30
1 38
1 46
2 29
2 35
2 13
2 82
3 100
3 72
3 63
3 45
代码是:
l1 <- seq(1, 3, 1)
G<-matrix(data=0, nrow=3, ncol=3)
for (m in seq_along(l1)){
for (n in seq_along(l1)){
G[m,n]=sum(apply(dt,1,function (y) {ifelse(dt$V2[dt$V1==m]<dt$V2[dt$V1==n] ,1,0)}))
}
}
我得到的 G:
[,1] [,2] [,3]
[1,] 0 24 36
[2,] 24 0 36
[3,] 12 12 0
我想要的 G:
[,1] [,2] [,3]
[1,] 0 5 14
[2,] 5 0 13
[3,] 14 13 0
基本上,对于 V1=1,我们希望将 V2 的所有值与 V1=2 和 3 的所有 V2 值进行比较。对 V2 和 V3 重复相同的操作。
For V1=1->
( 60 > 29 : loop returns 0,
60 > 35 : loop returns 0,
60 > 13 : loop returns 0,
60 < 82 : loop returns 1,
30 > 29 : loop returns 0,
30 < 35 : loop returns 1,
30 > 13 : loop returns 0,
30 < 82 : loop returns 1,
38 > 29 : loop returns 0,
38 > 35 : loop returns 0,
38 > 13 : loop returns 0,
38 < 82 : loop returns 1,
46 > 29 : loop returns 0,
46 > 35 : loop returns 0,
46 > 13 : loop returns 0,
30 < 82 : loop returns 1)=Sum is 5 (i.e. G[1,2])
如何修改代码以获得所需的输出?
【问题讨论】:
标签: r for-loop if-statement apply