我正在尝试生成仅由数字和“”(空格)组成的表。我需要使用科学计数法对数字进行格式化。问题是,如果我将此矩阵设为数字类型,则不能使用“”,因为它不是数字,但我需要将其作为空白。如果我使用字符类型矩阵,则比例尺库中的“科学”函数将无法识别数字,因为它们是数字类型。如果我尝试在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,并且仅使用第一个元素
答案 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
但是请不要使用它。如果这样做,不要说我告诉过您以这种方式进行这种替换,我会失去我所拥有的一点信誉:-)