2017-08-15 116 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