这是你的data.frame
:
x <- structure(list(apple = c(3L, 0L, 1L), banana = 0:2, orange = c(2L,
1L, 2L)), .Names = c("apple", "banana", "orange"), class = "data.frame", row.names = c("Tim",
"Tom", "Bob"))
你的矩阵:
as.matrix((x > 0) + 0)
apple banana orange
Tim 1 0 1
Tom 0 1 1
Bob 1 1 1
更新
我想象不到在睡前草率地发布一个帖子会引起任何讨论,但这些讨论本身非常有趣,因此我想在这里总结一下:
我的直觉是简单地利用R中TRUE
和FALSE
的底层数字1
和0
。如果你尝试(并不是一种很好的方法)检查等价性,例如1 == TRUE
或0 == FALSE
,你会得到TRUE
。我的快捷方式(结果证明比正确或至少是更加正确的方式需要更多时间)是只需将0
添加到我的TRUE
和FALSE
中,因为我知道R会强制转换逻辑向量为数字。
更正确或者说更合适的方式是使用as.numeric
来转换输出(我认为这就是@JoshO'Brien打算写的内容)。但是.... 不幸的是,这会删除输入的维数属性,所以您需要将结果向量重新转换为矩阵,事实证明,这仍然比我在答案中添加0
要快。
阅读了评论和批评后,我想再添加一个选项---使用apply
循环遍历列并使用as.numeric
方法。虽然比手动重新创建矩阵要慢,但比将0
添加到逻辑比较中略快一些。
x <- data.frame(replicate(1e4,sample(0:1e3)))
library(rbenchmark)
benchmark(X1 = {
x1 <- as.matrix((x > 0) + 0)
},
X2 = {
x2 <- apply(x, 2, function(y) as.numeric(y > 0))
},
X3 = {
x3 <- as.numeric(as.matrix(x) > 0)
x3 <- matrix(x3, nrow = 1001)
},
X4 = {
x4 <- ifelse(x > 0, 1, 0)
},
columns = c("test", "replications", "elapsed",
"relative", "user.self"))
all.equal(x1, x2, check.attributes=FALSE)
all.equal(x1, x3, check.attributes=FALSE)
all.equal(x1, x4, check.attributes=FALSE)
谢谢大家的讨论!
as.matrix
将其强制转换为矩阵。 - Blue Magister