R中的lower.tri()示例

时间:2014-05-09 20:50:41

标签: r matrix subset

星期五下午,我的大脑一定不会太尖锐。在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)。提前谢谢。

1 个答案:

答案 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}},因此您没有获得这种特殊行为