R中按列的复杂元素比较

sta*_*uyz 1 arrays loops r

我想按两个列条目比较主题:“值”和“长度”。将该主题与数据框中的所有其他主题进行比较;他们将为“长度”列中值较高的每个主题获得-1。如果“长度”列中的条目的值较高,则它们将获得+1。如果它们的值等于“长度”(Length)列中另一个主题的值,则将比较“值”(Value)列中的值(如果条目更大,则为+1;如果值相等,则为0;如果值等于-1,则为-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] }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

预期产量:

            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
Run Code Online (Sandbox Code Playgroud)

Rol*_*and 6

基本上,您想使用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
Run Code Online (Sandbox Code Playgroud)