将计数矩阵转换为二进制存在矩阵

lol*_*ity 7 binary r matrix

我有一个数据框存储拥有不同种类的不同种类的水果.如下

    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)

更新

我不知道快速的睡前时间发布会产生任何 讨论,但讨论本身非常有趣,所以我想总结一下:

我的直觉是简单地认为在一个TRUEFALSE在R 下面的数字1和数字0.如果你尝试(一种不太好的方式)来检查等价,例如1 == TRUE0 == FALSE,你会得到TRUE.我的快捷方式(结果比正确的,或至少更概念上正确的方式花费更多的时间)只是添加到我的s和s,因为我知道R会强制逻辑向量为数字.0TRUEFALSE

正确的,或者至少是更合适的方式是使用转换输出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)

谢谢你们的讨论!

  • @ChinmayPatil - 首先,Ananda的解决方案比`ifelse()`版本快3-4倍.(FWIW`as.logical(as.matrix(x)> 0)`再次两倍于**他的**解决方案.)这是我用来运行几次试验的data.frame:`x < - data .frame(复制(1E4,样品(0:1E3)))`. (3认同)

小智 5

我通常使用这种方法:

df[df > 0] = 1
Run Code Online (Sandbox Code Playgroud)