星期五下午,我的大脑一定不会太尖锐。在R http://stat.ethz.ch/R-manual/R-patched/library/base/html/lower.tri.html中lower.tri()函数的示例中,您可以将矩阵的所有下三角元素转换为NA,如下所示。
(m2 <- matrix(1:20, 4, 5))
lower.tri(m2)
m2[lower.tri(m2)] <- NA
m2
如何将结果保存在新对象中,比如m2
,而不是覆盖现有的m3
对象?
我试过了:
m3 <- m2[lower.tri(m2)] <- NA
m3
这会返回NA
我可以通过将整个事物包装在一个函数中来获得我想要的结果。
lower.tri.na <- function(m2) {
m2[lower.tri(m2)] <- NA
return(m2)
}
m3 <- lower.tri.na(m2)
m3
以下代码也有效(但我真的想使用lower.tri()
函数):
m3 <- ifelse(row(m2) > col(m2), NA, m2)
是否有更好(更有效)的方式?...我的猜测是肯定的。 (并且愚蠢的问题为什么这个代码或协调风格不起作用m3 <- m2[lower.tri(m2)] <- NA
)。提前谢谢。
答案 0 :(得分:2)
最简单的答案是
m3<-m2
m3[lower.tri(m3)] <- NA
或者你可以做到
m3<-`[<-`(m2, lower.tri(m2), NA)
看起来很尴尬,但它有效。您基本上拦截了[]<-
通常会替换分配中的变量并将其发送到新变量的值。\
您的m3 <- m2[lower.tri(m2)] <- NA
策略不起作用,因为当a <- b <- c
a <- (b <- c)
与a <-c; b<-c
相同时,m3<-NA
与[<-
相同因为赋值运算符通常会传递等式右边的内容。所以你只是在做NA
。有一个名为[]
的矩阵的特殊运算符,它会根据您提供的索引,将m3
重新调整为适当大小的维度。但是在这里,您没有在{{1}}上使用{{1}},因此您没有获得这种特殊行为