ここにあなたの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の aTRUE
との下に数字とがあるという事実を単純に理解することでした。またはなどの等価性をチェックしようとすると (あまり良い方法ではありません)、が得られます。R が論理ベクトルを数値に強制することがわかっているので、私の近道の方法 (正しい方法、または少なくとも概念的に正しい方法よりも時間がかかることが判明) は、 と に追加するだけでした。FALSE
1
0
1 == TRUE
0 == FALSE
TRUE
0
TRUE
FALSE
正しい、または少なくともより適切な方法は、を使用して出力を変換することas.numeric
です(@ JoshO'Brienが意図したものだと思います)。しかし....残念ながら、それは入力の次元属性を削除するため、結果のベクトルをマトリックスに再変換する必要があります。これは、回答で行ったように追加するよりも高速です。0
コメントと批判を読んだ後、もう 1 つのオプションを追加すると思いました。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
議論してくれてありがとう!