【问题标题】:R: Convert Matrix to YES, NO dataframeR:将矩阵转换为是,否数据帧
【发布时间】:2017-08-15 06:40:16
【问题描述】:

我有一个这样的矩阵

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),因此使用 apply 需要非常长的时间

我也试过

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

但是即使这样也需要很多时间

我可以通过这个获得更好的性能吗?

【问题讨论】:

  • 为什么需要"Yes"/"No"。只需执行 df &gt; 0 并获取 TRUE/FALSE 即可
  • 您是否尝试过使用replace?
  • @Bati:每列(向量)都可以使用replace,我需要对所有列都这样做,会有帮助吗?
  • 感谢大卫:这有效,您能否将其添加到答案中,这真的很有帮助
  • df &gt; 0 或者如果不可能有负值 df[] &lt;- as.logical(df)。创建字符值不是必需的,而且效率较低。

标签: r matrix dataframe apply


【解决方案1】:

这是创建矩阵的一种方法:

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

结果:

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

【讨论】:

  • 你为什么在这里加了+1?
  • @Username 命令df &gt; 0 返回一个带有TRUEs 和FALSEs 的逻辑向量。在数学运算中,TRUE 代表 1,FALSE 代表 0。由于我加了 1,所以得到的向量包含 1 和 2。这些值用于索引长度为 2 的向量 c("No", "Yes")。
【解决方案2】:

如果您的目标是直观地检查矩阵,而不是使用其中的内容,那么symnum 函数就是专门为这种用途而设计的。 ?symnum 的描述部分说

对给定的数字或逻辑向量或数组进行符号编码。特别适用于结构化矩阵的可视化,例如相关矩阵、稀疏矩阵或逻辑矩阵。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多