我有一个数据框存储了不同人的不同种类的水果的数量。如下所示
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
答案 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中的TRUE
和FALSE
下面是数字1
和0
。如果您尝试(不是很好的方式)检查等效性,例如1 == TRUE
或0 == FALSE
,您将获得TRUE
。我的快捷方式(比更正确 <或> 更正确,或者至少更概念上正确的方式)只是添加{{ 1}}到我的0
和TRUE
,因为我知道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)})