我有一个数据帧,我想对前56列中的每个数据点进行二值化,条件是如果该值大于0则设置为1,否则设置为0.是否有一种简单的方法做这个?
使用矢量化,ifelse您可以:
m[,1:56] <- ifelse(m[,1:56] > 0,1,0)
Run Code Online (Sandbox Code Playgroud)
例如,我们可以在小矩阵中测试它:
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
Run Code Online (Sandbox Code Playgroud)
你可以利用这个事实TRUE并FALSE等同于"1"和"0"并做:
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
Run Code Online (Sandbox Code Playgroud)
这个想法+0只是强制TRUE和FALSE它们的数值等价的逻辑值.如果您正在使用矩阵中的所有列并且已使用as.numeric(mydf > 0),则必须将结果向量重新转换为矩阵.但是,在这种情况下,这非常有效(正如@Dason指出的那样).
mydf[, 1:5] <- as.numeric(mydf[, 1:5] > 0)
Run Code Online (Sandbox Code Playgroud)