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

时间:2013-01-25 16:47:32

标签: r matrix binary

我有一个数据框存储了不同人的不同种类的水果的数量。如下所示

    apple  banana  orange
Tim     3       0       2
Tom     0       1       1
Bob     1       2       2

同样,这些数字是水果的数量。如何将其更改为存在矩阵,这意味着如果一个人有一个水果,无论他有多少,那么我记录1,如果没有,记录为0.如下所示

    apple  banana  orange
Tim     1       0       1
Tom     0       1       1
Bob     1       1       1

5 个答案:

答案 0 :(得分: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"))

你的矩阵:

as.matrix((x > 0) + 0)
    apple banana orange
Tim     1      0      1
Tom     0      1      1
Bob     1      1      1

更新

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

我的直觉是简单地认为在R中的TRUEFALSE下面是数字10。如果您尝试(不是很好的方式)检查等效性,例如1 == TRUE0 == FALSE,您将获得TRUE。我的快捷方式(比更正确 <或> 更正确,或者至少更概念上正确的方式)只是添加{{ 1}}到我的0TRUE,因为我知道R会将逻辑向量强制转换为数字。

正确的,或者至少更合适的方法是使用FALSE转换输出(我认为这是@JoshO'Brien打算写的)。但不幸的是,这会删除输入的维度属性,因此您需要将结果向量重新转换为矩阵,结果是 仍然 < / strong>比我在答案中添加as.numeric更快。

阅读了评论和批评之后,我想我会再添加一个选项---使用0循环遍历列并使用apply方法。与手动重新创建矩阵相比,更慢,但稍快比将as.numeric添加到逻辑比较中更快

0

感谢您的讨论!

答案 1 :(得分:5)

我通常使用这种方法:

df[df > 0] = 1

答案 2 :(得分:4)

使用可以使用ifelse。它应该同时适用于矩阵和数据帧,但结果值将是矩阵

> df <- cbind(aaple = c(3, 0 , 1), banana = c(0, 1, 2), orange = c(2, 1, 2))
> df
     aaple banana orange
[1,]     3      0      2
[2,]     0      1      1
[3,]     1      2      2

> ifelse(df>0, 1, 0)
     aaple banana orange
[1,]     1      0      1
[2,]     0      1      1
[3,]     1      1      1

答案 3 :(得分:1)

只需使用比较:

d = t(matrix(c(3,0,2,0,1,1,1,2,2), 3))
d > 0
t(matrix(as.numeric(d>0), ncol(d)))

答案 4 :(得分:0)

> pippo
  person apple banana orange
1    Tim     1      0      2
2    Tom     0      1      1
3    Bob     1      2      2
> cols <- c("apple", "banana", "orange")
> lapply(cols, function(x) {pippo[,x] <<- as.numeric(pippo[,x] >= 1)})