我有一个数据框存储拥有不同种类的不同种类的水果.如下
apple banana orange
Tim 3 0 2
Tom 0 1 1
Bob 1 2 2
Run Code Online (Sandbox Code Playgroud)
同样,数字是水果的数量.如何将其更改为存在矩阵,这意味着如果一个人有一个水果,无论他有多少,那么我记录1,如果没有,记录0.如下
apple banana orange
Tim 1 0 1
Tom 0 1 1
Bob 1 1 1
Run Code Online (Sandbox Code Playgroud)
A5C*_*2T1 18
这是你的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"))
Run Code Online (Sandbox Code Playgroud)
你的矩阵:
as.matrix((x > 0) + 0)
apple banana orange
Tim 1 0 1
Tom 0 1 1
Bob 1 1 1
Run Code Online (Sandbox Code Playgroud)
我不知道快速的睡前时间发布会产生任何 讨论,但讨论本身非常有趣,所以我想总结一下:
我的直觉是简单地认为在一个TRUE
和FALSE
在R 下面的数字1
和数字0
.如果你尝试(一种不太好的方式)来检查等价,例如1 == TRUE
或0 == FALSE
,你会得到TRUE
.我的快捷方式(结果比正确的,或至少更概念上正确的方式花费更多的时间)只是添加到我的s和s,因为我知道R会强制逻辑向量为数字.0
TRUE
FALSE
正确的,或者至少是更合适的方式是使用转换输出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"))
# test replications elapsed relative user.self
# 1 X1 100 116.618 1.985 110.711
# 2 X2 100 105.026 1.788 94.070
# 3 X3 100 58.750 1.000 46.007
# 4 X4 100 382.410 6.509 311.567
all.equal(x1, x2, check.attributes=FALSE)
# [1] TRUE
all.equal(x1, x3, check.attributes=FALSE)
# [1] TRUE
all.equal(x1, x4, check.attributes=FALSE)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)
谢谢你们的讨论!
归档时间: |
|
查看次数: |
7985 次 |
最近记录: |