我有一个数据框,并且我想在前56列中对每个数据点进行二进制化处理,条件是如果该值大于0,则它会被设置设为1,否则设为0.有没有简单的方法来做到这一点?我需要在数据框中“二进制化”一些数据R
回答
使用矢量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
我的想法确切! (所以我不得不发布一个不同的选择。) – A5C1D2H2I1M1N2O1R2T1 2013-03-06 04:36:18
@AnandaMahto,太棒了! – 2013-03-06 04:41:42
@RicardoSaporta,我实际上更喜欢'ifelse',以防你不仅仅需要二进制结果。 – A5C1D2H2I1M1N2O1R2T1 2013-03-06 04:42:57
你可以利用的事实,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
+0
的想法仅仅是强制TRUE
和FALSE
的逻辑值达到它们的数字等值。如果您正在使用全部矩阵中的列,并且您使用了as.numeric(mydf > 0)
,则必须将结果向量重新转换为矩阵。然而,在这种情况下,这很好地工作(正如@Dason所指出的那样)。
mydf[, 1:5] <- as.numeric(mydf[, 1:5] > 0)
你在这里尝试过使用'as.numeric'吗?它代替我的行为很好...如果我们不做替换,那么差异很重要,但对于这样的事情,它可以正常工作。 – Dason 2013-03-06 05:21:35
@Dason,很好! (不,我没有尝试 - 只是假设我会得到关于不同行长度的错误)。我会推测,很好的旧回收。我会更新。谢谢。 – A5C1D2H2I1M1N2O1R2T1 2013-03-06 05:23:55
使用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
方法甚至更快!
在我最近更新的答案中添加'as.numeric'选项(感谢Dason做我的作业)。根据早先的经验,这应该更快。 – A5C1D2H2I1M1N2O1R2T1 2013-03-06 05:28:54
@AnandaMahto - 完成。是的。 – mnel 2013-03-06 05:31:05
- 1. 在R中写入二进制数据
- 2. R中的二进制数据帧
- 3. flash as3 - 我需要在byteArray数据中进行二进制搜索
- 4. 二进制数据
- 5. 二进制数据
- 6. 需要帮助才能从pickle中提取二进制数据
- 7. 二进制数据在MySQL
- 8. 机械化上传二进制数据
- 9. 数据转换:从二进制到R的观测数据
- 10. 根据簇中的聚合顺序和二进制数据R
- 11. 在二进制数据中拟合R中的黄土线
- 12. 使用XMLHttpRequest下载二进制数据,不需要overrideMimeType
- 13. 元数据被拒绝,但需要更改二进制
- 14. 在Python中对float64熊猫数据框进行二进制化处理
- 15. 需要帮助转动一些数据
- 16. 在R中读取不确定长度的二进制数据
- 17. 在R中合并之前需要对数据进行排序?
- 18. 在elisp中读取二进制数据
- 19. 在Python中解释二进制数据
- 20. 在PHP中使用二进制数据
- 21. 在mysql中存储二进制数据
- 22. 在PHP中输出二进制数据
- 23. 在matlab中连接二进制数据?
- 24. 在Matlab中处理二进制数据
- 25. 在android中使用二进制数据?
- 26. 移在C++中的二进制数据
- 27. 构建结构化二进制数据解析器的框架?
- 28. 数据库正常化我需要它
- 29. 我需要标准化数据Scikit
- 30. cURL中的数据二进制参数
你也可以看到[这个问题](http://stackoverflow.com/q/14526429/1270695)和不同的答案,以及一些基准测试,如果速度值得关注的话。与这个问题的区别在于,你只是在处理一个列的子集。 – A5C1D2H2I1M1N2O1R2T1 2013-03-06 04:53:53
是否有一个特定的原因,你需要的值是0/1而不是TRUE/FALSE?您可以放弃将结果视为合乎逻辑的几件事情。 – Dason 2013-03-06 05:46:35