在R中的ifelse中循环行
我有一个数据帧,dt,有两个变量,如下所示。使用下面的代码,我想得到矩阵G在R中的ifelse中循环行,r,for-loop,if-statement,apply,R,For Loop,If Statement,Apply,我有一个数据帧,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)){
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 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])
对于V1=1->
(60>29:循环返回0,
60>35:循环返回0,
60>13:循环返回0,
60<82:循环返回1,
30>29:循环返回0,
30<35:循环返回1,
30>13:循环返回0,
30<82:循环返回1,
38>29:循环返回0,
38>35:循环返回0,
38>13:循环返回0,
38<82:循环返回1,
46>29:循环返回0,
46>35:循环返回0,
46>13:循环返回0,
30<82:循环返回1)=和为5(即[1,2])
如何修改代码以获得所需的输出?我将使用
combn
和outer
的组合来解决它:
#Unique V1 values
vec <- unique(df$V1)
#Count <= valies
val <- combn(vec, 2, function(x)
sum(outer(df$V2[df$V1 == x[1]], df$V2[df$V1 == x[2]], `<=`)))
val
#[1] 5 14 13
#Create an empty matrix
mat <- matrix(0,length(vec), length(vec))
#Fill upper and lower triangle of the matrix.
mat[upper.tri(mat)] <- val
mat[lower.tri(mat)] <- val
mat
# [,1] [,2] [,3]
#[1,] 0 5 14
#[2,] 5 0 13
#[3,] 14 13 0
#唯一V1值
vec
#Unique V1 values
vec <- unique(df$V1)
#Count <= valies
val <- combn(vec, 2, function(x)
sum(outer(df$V2[df$V1 == x[1]], df$V2[df$V1 == x[2]], `<=`)))
val
#[1] 5 14 13
#Create an empty matrix
mat <- matrix(0,length(vec), length(vec))
#Fill upper and lower triangle of the matrix.
mat[upper.tri(mat)] <- val
mat[lower.tri(mat)] <- val
mat
# [,1] [,2] [,3]
#[1,] 0 5 14
#[2,] 5 0 13
#[3,] 14 13 0