【问题标题】:Loop over rows within ifelse in R在R中的ifelse中循环行
【发布时间】: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


    【解决方案1】:

    我会使用 combnouter 的组合来解决它:

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 2014-06-19
      相关资源
      最近更新 更多