需要有条件地将功能应用于字符矩阵中的每个元素

时间:2018-11-01 06:11:55

标签: r

我正在尝试生成仅由数字和“”(空格)组成的表。我需要使用科学计数法对数字进行格式化。问题是,如果我将此矩阵设为数字类型,则不能使用“”,因为它不是数字,但我需要将其作为空白。如果我使用字符类型矩阵,则比例尺库中的“科学”函数将无法识别数字,因为它们是数字类型。如果我尝试在for循环中编写一个遍历矩阵中每个元素的if语句,则该条件仅应用于第一个元素,从而在下面产生以下错误:

  

if(moduleTraitPvalueSig!=“”){时出错    需要TRUE / FALSE的缺失值   另外:警告消息:   在if(moduleTraitPvalueSig!=“”){:   条件的长度> 1,并且只会使用第一个元素

我正在使用一个名为moduleTraitPvalueSig的矩阵,而产生上述错误的代码就是这样

library(scales)
moduleTraitPvalueSig <- moduleTraitPvalue;
moduleTraitPvalueSig[moduleTraitPvalueSig>=0.05]<- ""
for(row in 1:nrow(moduleTraitPvalueSig)) {
  for(col in 1:ncol(moduleTraitPvalueSig)) {
    if(moduleTraitPvalueSig!="")
    {scientific(moduleTraitPvalueSig)}
  }
}
  

if(moduleTraitPvalueSig!=“”){:

     

需要TRUE / FALSE时缺少值

     

此外:警告消息:

     

在if(moduleTraitPvalueSig!=“”){:

     

条件的长度> 1,并且仅使用第一个元素

1 个答案:

答案 0 :(得分:0)

请勿混淆数字使用和计算与渲染。在准备打印/渲染之前,您不必担心科学计数法和空格。

一些示例数据:

m <- matrix(pi, nr=3, nc=3)
m[1,2] <- m[2,3] <- NA
m
#          [,1]     [,2]     [,3]
# [1,] 3.141593       NA 3.141593
# [2,] 3.141593 3.141593       NA
# [3,] 3.141593 3.141593 3.141593

您不需要循环,只需一次转换即可。

m[] <- scales::scientific(m)
m
#      [,1]       [,2]       [,3]      
# [1,] "3.14e+00" "NA"       "3.14e+00"
# [2,] "3.14e+00" "3.14e+00" "NA"      
# [3,] "3.14e+00" "3.14e+00" "3.14e+00"

不幸的是,scale::scientific不在乎NA(奇数!),但这对我们来说并没有多大改变,我们可以通过这种方式重新分配:

m[ m == "NA" ] <- ""
m
#      [,1]       [,2]       [,3]      
# [1,] "3.14e+00" ""         "3.14e+00"
# [2,] "3.14e+00" "3.14e+00" ""        
# [3,] "3.14e+00" "3.14e+00" "3.14e+00"

关于您的代码/错误的其他说明:

  • the condition has length > 1是因为if (condition) { ... }要求长度条件恰好为1。由于您在比较整个对象,因此它返回的长度为TRUE / {{1 }} / FALSE)的长度等于对象的总尺寸;也就是说,如果您的矩阵是3x5,那么您的NA语句将获得15个逻辑值。只需要一个,其他任何东西都是错误。使用if对if / else进行矢量化处理,但这是另一回事了(这里完全不需要)。 SO上有无数个问题引用了此精确错误消息,我建议您可以对其进行更多搜索以获取更多信息。

  • ifelse(cond, true_expr, false_expr)通常是相关的,当逻辑返回的长度为0而不是1(预期)或大于1(您收到的另一个错误)时给出。这种错误在SO上也很常见,研究会为您提供大量的示例和研究/修复方法。

  • 如果要逐元素进行矩阵比较(在给定的目标下R效率很低),那么至少可以使用missing value where TRUE/FALSE needed循环值。使用我在上方生成的for矩阵,代码会变成类似以下内容:

    m

    但是请不要使用它。如果这样做,不要说我告诉过您以这种方式进行这种替换,我会失去我所拥有的一点信誉:-)