首页 > 解决方案 > R中按列进行的复杂元素比较

问题描述

我想通过两列条目比较主题:值和长度。该主题将与数据框中的所有其他主题进行比较;对于“长度”列中具有较高值的​​每个主题,他们将获得 -1。如果他们在“长度”列中的条目具有更高的值,他们将获得 +1。如果它们的值等于“长度”列中另一个主题的值,则将比较它们在“值”列中的值(如果它们的条目更大,则为 +1;如果值相等,则为 0;如果它们的值大于,则为 -1较少的)。新列“Value2”中的条目将是比较中 +1、0 或 -1 值的总和。

我在基础 R 中写了一些东西,但它似乎不起作用。

             Value        Length
Subject1     2            0
Subject2     0            1
Subject3     5            1
Subject4     4            5
Subject5     4            5
Subject6     7            6
Subject7     9            8


for(i in 1:length(x)){
   for(j in 1:length(x)){
      if(i != j){
         w = z[c(-i), ]
         if(w$length[i] < w$length[j]){ value2[i] = value2[i] -1   }

         if(w$length[i] > w$length[j]){ value2[i] = value2[i} + 1  }

         if(w$length[i] == w$length[j]){
            if(w$value[i] < w$value[j]){ value2[i] = value2[i] - 1 }
            if(w$value[i] > w$value[j]){ value2[i] = value2[i] + 1 }

            if(w$value[i] == w$value[j]){ value2[i] = value2[i] }
         }
      }
   }
}

预期输出:

            Value        Length      Value2
Subject1     2            0          -6
Subject2     0            1          -4
Subject3     5            1          -2          
Subject4     4            5          +1
Subject5     4            5          +1
Subject6     7            6          +4
Subject7     9            8          +6

标签: arraysrloops

解决方案


基本上,您想使用rank和它的平局,但使用两个而不是一个向量作为输入。最简单的解决方案是结合这两个向量。例如,如果你只有整数,你可以这样做:

res <- DF$Length + DF$Value/(max(DF$Value) + 1)
#[1] 0.2 1.0 1.5 5.4 5.4 6.7 8.9
res <- rank(res)
#[1] 1.0 2.0 3.0 4.5 4.5 6.0 7.0
res <- c(scale(res * 2, scale = FALSE)) #transformation of ranks
#[1] -6 -4 -2  1  1  4  6

推荐阅读