6

データフレームがあり、値が0より大きい場合は1に設定され、それ以外の場合は0に設定されるという条件で、最初の56列のすべてのデータポイントを2値化したいと思います。簡単な方法はありますかこれを行う?

4

3 に答える 3

9

ベクトル化を使用すると、次のifelseことができます。

   m[,1:56] <- ifelse(m[,1:56] > 0,1,0)

たとえば、これを小さなマトリックスでテストできます。

 m <- matrix(sample(c(-2,2),5*3,rep=T),ncol=5,nrow=3,byrow=T)
> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    2    2    2   -2
[2,]    2    2   -2    2   -2
[3,]    2    2    2    2    2
> m[,2:5] <- ifelse(m[,2:5] > 0,1,0)
> m
     [,1] [,2] [,3] [,4] [,5]
[1,]    2    1    1    1    0
[2,]    2    1    0    1    0
[3,]    2    1    1    1    1
于 2013-03-06T04:31:40.953 に答える
5

「1」と「0」に等しいTRUEという事実を利用して、次のことを行うことができます。FALSE

set.seed(1)
mydf <- data.frame(matrix(rnorm(100), nrow = 10))
mydf[, 1:5] <- (mydf[, 1:5] > 0) + 0
mydf
#    X1 X2 X3 X4 X5         X6          X7           X8         X9        X10
# 1   0  1  1  1  0  0.3981059  2.40161776  0.475509529 -0.5686687 -0.5425200
# 2   1  1  1  0  0 -0.6120264 -0.03924000 -0.709946431 -0.1351786  1.2078678
# 3   0  0  1  1  1  0.3411197  0.68973936  0.610726353  1.1780870  1.1604026
# 4   1  0  0  0  1 -1.1293631  0.02800216 -0.934097632 -1.5235668  0.7002136
# 5   1  1  1  0  0  1.4330237 -0.74327321 -1.253633400  0.5939462  1.5868335
# 6   0  0  0  0  0  1.9803999  0.18879230  0.291446236  0.3329504  0.5584864
# 7   1  0  0  0  1 -0.3672215 -1.80495863 -0.443291873  1.0630998 -1.2765922
# 8   1  1  0  0  1 -1.0441346  1.46555486  0.001105352 -0.3041839 -0.5732654
# 9   1  1  0  1  0  0.5697196  0.15325334  0.074341324  0.3700188 -1.2246126
# 10  0  1  1  1  1 -0.1350546  2.17261167 -0.589520946  0.2670988 -0.4734006

の考え方は、の論理値とそれに相当する数値+0を強制することです。行列のすべての列で作業していて、を使用した場合は、結果のベクトルを行列に再変換する必要があります。ただし、この場合、これは完全に機能します(@Dasonが指摘しているように)。TRUEFALSEas.numeric(mydf > 0)

mydf[, 1:5] <- as.numeric(mydf[, 1:5] > 0)
于 2013-03-06T04:35:37.260 に答える
1

pminとを使用したアプローチpmax。(あまりお勧めしません)

pmin(pmax(m[,2:5], 0),1)

しかし、それはいくつかのベンチマークを追加することを可能にします

ag <- function() ifelse(m[,2:5] > 0,1,0)
mn <- function()pmin(pmax(m[,2:5], 0),1)
am <- function()  (m[, 2:5] > 0) + 0
am2 <- function()  as.numeric((m[, 2:5] > 0))

library(microbenchmark)
microbenchmark(ag(),mn(), am(), am2())
## Unit: microseconds
##   expr    min     lq  median      uq     max neval
##   ag() 19.888 20.712 21.9375 22.6430  39.548   100
##   mn() 50.135 51.172 52.2530 53.1055 113.854   100
##   am()  3.076  3.406  4.1755  4.6030   7.912   100
##  am2()  2.623  2.989  3.4640  4.0135   6.995   100

@AnandaMahtoのソリューションは明らかに勝者であり、as.numericアプローチはさらに高速です。

于 2013-03-06T05:25:45.000 に答える