2017-08-15 84 views
2

我有這樣R:轉換矩陣爲YES,NO數據幀

df <- matrix(c(rep(1,3),rep(2,3)),nrow=3,ncol=2) 

df: 
     [,1] [,2] 
[1,] 1 2 
[2,] 1 2 
[3,] 1 2 

我想每一個單元格的值轉換爲YES,如果大於0矩陣,否則NO

我明白,我能做到這一點使用

apply(df, 2, function(x) ifelse(x > 0, "Yes","No")) 

但是我矩陣是非常巨大的(百萬* 5000),因此使用應用需要瘋狂大的時間

我也曾嘗試

df <- ifelse(df > 0, "Yes","No") 

然而,即使這需要大量的時間

我能實現這個更好的性能?

+9

爲什麼你需要''是「/」否「'。只要做'df> 0'並且得到'TRUE/FALSE'而不是 –

+0

你試過用'replace'嗎? – Bati

+0

@Bati:替換可以用於每個列(向量),我需要爲所有列做這個,它會有幫助嗎? –

回答

5

這裏有一種方法來創建矩陣:

df[] <- c("No", "Yes")[(df > 0) + 1] 

結果:

 [,1] [,2] 
[1,] "Yes" "Yes" 
[2,] "Yes" "Yes" 
[3,] "Yes" "Yes" 
+0

這確實是一個非常巧妙的技巧。和你一起。 –

+0

你爲什麼在這裏添加+1? –

+1

@Username命令'df> 0'返回一個帶有TRUE和FALSE的邏輯向量。在數學運算中,「TRUE」代表1,「FALSE」代表0.因爲我加1,結果矢量包含1和2。這些值用於索引長度爲2的矢量'c(「否」,「是」)。 –

0

如果你的目標是用肉眼檢驗矩陣,並且不使用內容,此次被symnum功能設計爲此特別使用。 ?symnum的說明部分表示

符號編碼給定的數字或邏輯向量或數組。特別適用於結構化矩陣的可視化,例如相關性,稀疏性或邏輯性矩陣。

symnum(df, cutpoints=c(-Inf, 0, Inf), symbols=c("no", "yes")) 

[1,] yes yes 
[2,] yes yes 
[3,] yes yes