gpt4 book ai didi

r - 将数值转换为二进制 (0/1)

转载 作者:行者123 更新时间:2023-12-04 09:04:11 27 4
gpt4 key购买 nike

我有一个数据框,其中包含不同人的不同种类水果的数量。像下面

    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

最佳答案

这是您的 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 ,但讨论本身很有趣,所以我想在这里总结一下:
我的直觉是简单地接受以下事实: TRUEFALSE在 R 中,是数字 10 .如果您尝试(一种不太好的方法)检查​​等效性,例如 1 == TRUE0 == FALSE , 你会得到 TRUE .我的捷径(事实证明,比正确的,或者至少在概念上更正确的方法花费 更多的时间 )是添加 0到我的 TRUE s 和 FALSE s,因为我知道 R 会将逻辑向量强制转换为数字。
正确的,或者至少是更合适的方法,是使用 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
谢谢大家的讨论!

关于r - 将数值转换为二进制 (0/1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14526429/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com