Сравнение чисел и получение двоичного вывода в R

Так что то, что я пытаюсь сделать, может быть довольно элементарным, поэтому, пожалуйста, извините за мое невежество.

У меня есть матрица, состоящая из двух столбцов кратных изменений:

mat<-matrix(rexp(10, rate=.1), ncol=2)
colnames(mat)<-c("ctr","tst")
mat
            ctr       tst
[1,]  3.80024188  3.450514
[2,]  3.19933014  5.315761
[3,]  0.01122948  4.398819
[4,] 21.86070191 26.109626
[5,]  5.38260987  1.678203

Что я хотел бы сделать, так это добавить третий столбец, содержащий двоичное значение «1» или «0» в качестве результата сравнения изменения кратности в столбце ctr со столбцом tst с некоторым заданным допуском, например 0,75. .

Таким образом, в основном значение в новом столбце mat [1,3], в котором сравниваются mat [1,1] и mat [1,2], будет «0» (расстояние между ними меньше 0,75), в то время как mat [3,3 ] сравнение mat [3,1] и mat [3,2] будет содержать значение «1» (более 0,75 друг от друга).

Вдобавок (и здесь для меня это становится непросто) мне нужно включить способ сравнения значений «Inf» и «-Inf» с обычными числами, так как некоторые из моих изменений складываются в «Inf» или «-Inf». .

Заранее спасибо!


person Tom A    schedule 22.05.2014    source источник
comment
Вероятно, вам следует указать, что вы ожидаете, когда Inf и -Inf сравниваются с фактическими значениями. Всегда 1?   -  person joran    schedule 23.05.2014


Ответы (2)


Определите функцию сравнения, которая возвращает TRUE всякий раз, когда два входа разнесены не более чем на 0,75, либо оба Inf, либо оба -Inf:

compare <- function(xx) {
    if ( (xx[1]==Inf & xx[2]==Inf) | (xx[1]==-Inf & xx[2]==-Inf) ) {
        TRUE
    } else {
        abs(diff(xx))<=0.75
    }
}

Затем создайте тестовую матрицу и apply эту функцию (взяв ее логическую инверсию, используя ! для нестандартного преобразования TRUE в 0 и FALSE в 1):

> set.seed(1)
> mat <- rbind(matrix(rexp(10, rate=.1), ncol=2),c(1,Inf),c(-Inf,0),c(Inf,Inf),c(Inf,-Inf),c(-Inf,-Inf))
> colnames(mat)<-c("ctr","tst")
> 
> cbind(mat,!apply(mat,1,compare))
            ctr       tst  
 [1,]  7.551818 28.949685 1
 [2,] 11.816428 12.295621 0
 [3,]  1.457067  5.396828 1
 [4,]  1.397953  9.565675 1
 [5,]  4.360686  1.470460 1
 [6,]  1.000000       Inf 1
 [7,]      -Inf  0.000000 1
 [8,]       Inf       Inf 0
 [9,]       Inf      -Inf 1
[10,]      -Inf      -Inf 0
> 
person Stephan Kolassa    schedule 22.05.2014
comment
Идеально! Именно то, что я хотел. Большое спасибо, Стефан. - person Tom A; 23.05.2014

Просто выстрел в темноте:

set.seed(123)
mat<-matrix(rexp(10, rate=.1), ncol=2)
colnames(mat)<-c("ctr","tst")
#Add some Inf examples
mat[4,1] <- Inf
mat[2,2] <- -Inf
mat <- cbind(mat,(abs(mat[,1] - mat[,2]) >= 0.75) + 0L)
mat

##            ctr        tst  
##[1,]  8.4345726  3.1650122 1
##[2,]  5.7661027       -Inf 1
##[3,] 13.2905487  1.4526680 1
##[4,]        Inf 27.2623646 1
##[5,]  0.5621098  0.2915345 0
person joran    schedule 22.05.2014