【发布时间】:2015-05-07 19:43:13
【问题描述】:
我是 R 新手,这可能是一个愚蠢的问题,但我不知道如何解决。
我有一个 for 循环,它可能会返回 i*j 非空元素。
我想将所有非空结果存储在一个列表中,但是如果我在循环中使用result[[i]]<-tmp,它最多只能存储i 元素,我如何能够将所有值存储在一个列表中?谢谢
result<-list()
for (i in 1:nrow(m)){
for (j in 1:i){
if(m[i,j]!=0 && m[j,i]!=0){
num=min(m[i,j],m[j,i])
tmp=c(i,j,num)
result[[i]]<-tmp
}
}
}
sample data
set.seed(123)
m= matrix(sample(0:5, size = 5*5, replace = TRUE), ncol = 5)
想要的
row col min
[1] 1 1 1
[1] 2 2 3
[1] 3 1 2
[1] 3 2 2
[1] 3 3 4
[1] 4 1 5
[1] 4 2 1
[1] 4 4 1
[1] 5 1 5
[1] 5 2 2
[1] 5 4 5
[1] 5 5 3
根据大卫的回答
pmin(mx[upper.tri(mx, diag = TRUE)], mx[lower.tri(mx, diag = TRUE)])
[1] 1 0 2 5 2 3 5 1 0 1 3 0 1 5 3
返回
> result
[[1]]
[1] 1 1 2
[[2]]
[1] 2 2 3
[[3]]
[1] 3 3 4
[[4]]
[1] 4 4 2
[[5]]
[1] 5 5 4
【问题讨论】:
-
R 中的 For 循环和不断增长的列表都非常慢。您能否将您的算法重新考虑为应用于矩阵每个元素的函数并使用
apply()? -
你不是基本在计算
pmin(m, t(m))吗? -
我不确定您要做什么以及什么不起作用。您也不需要如此大的数据集来重现您的问题。我认为像
m = matrix(sample.int(5, size = 5*5, replace = TRUE), ncol = 5)这样的东西应该做。还可以使用set.seed并显示您期望从for循环中得到什么。 -
谢谢大家,我正在尝试比较沿矩阵对角线对称位置的值并返回最小值...
-
pmin(m[upper.tri(m, diag = TRUE)], m[lower.tri(m, diag = TRUE)])怎么样?