[英]Convert numeric values into binary (0/1)
我有一個數據框,其中包含不同人的不同種類水果的數量。 像下面
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
我不知道睡前快速發帖會引起任何討論,但討論本身很有趣,所以我想在這里總結一下:
我的直覺是簡單地接受一個事實,即在 R 中的TRUE
和FALSE
之下,是數字1
和0
。 如果您嘗試(一種不太好的方法)檢查等效性,例如1 == TRUE
或0 == 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
謝謝大家的討論!
我通常使用這種方法:
df[df > 0] = 1
使用可以使用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
只需使用比較:
d = t(matrix(c(3,0,2,0,1,1,1,2,2), 3))
d > 0
t(matrix(as.numeric(d>0), ncol(d)))
> 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)})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.