【发布时间】:2013-08-27 08:38:57
【问题描述】:
我想比较不同行中的不同单元格,如果满足条件则返回一个值。
假设如下s_i =
[,1] [,2] [,3]
[1,] 0.43020494 0.7183179 0.4201009
[2,] 0.08625491 0.3007912 0.8768459
[3,] 0.80012649 0.8448729 0.7131344
我想比较所有的行(对),所以第 1,2 行; 1,3; 2,3; 2,1; 3,1 和第 3,2 行
输出 dgpos 包含组合的行号和返回的值。
我想比较行。第一行或第 1 行和第 2 行
1, if 2b≥1b
0, if 1a≥2c
(1a-2c )/ ((2b-2c) –(1b-1a), otherwise
其中 a、b 和 c 是 s_i 的列
第 1 行和第 2 行的 R-ish
If (s_i[2,2]>= s_i[1,2])
dgpos[rowindex,3]=1
If (s_i[1,1]>= s_i[2,3])
dgpos[rowindex,3]=0
else (otherwise)
dgpos[rowindex,3] =(s_i[1,1]- s_i[2,3])/((s_i[2,2]-s_i[2,3])-(s_i[1,2]-s_i[1,1]))
我想要的输出包含dgpos[,3]中返回的组合和值
[,1] [,2] [,3]
[1,] 1 2 0.5168453
[2,] 1 3 1
[3,] 2 3 1
[4,] 2 1 1
[5,] 3 1 0
[6,] 3 2 0.1235813
我有这个:
s_i=matrix(runif(9),3)
dgpos=matrix(0,(dim(s_i)[2]*(dim(s_i)[2]-1)),3)
rowindex=1
for (i in 1:nrow(s_i)) {
for (j in 1:nrow(s_i)) {
if (i!=j)
c1=s_i[i,]
c2=s_i[j+1,]
dgpos[rowindex,1]=i
dgpos[rowindex,2]=j+1
if (c2[2] >= c1[2])
dgpos[rowindex,3]=1
dgpos[rowindex,3] = ifelse ((c1[1]=c2[3]), 0 , c1[1]-c2[3]/((c2[2]-c2[3])-(c1[2]-c1[1])))
rowindex=rowindex+1
}
}
我知道循环不是首选,但目前(我的 r-ish 水平)我不知道更好的解决方案。我试过adply 和combn,没有结果。
MQ:如何比较不同行的不同单元格并根据几个条件返回一个值?
感谢您的帮助和赞扬。
【问题讨论】:
-
你想达到什么目的?如果您的扩展代码解决问题的效率非常低,那么要求人们浏览您的扩展代码是不合理的。
-
嗨@geotheory。感谢您的反馈。我明白。我想“我会展示我试图掌握这个想法的代码”。我试图通过使用两行 R-ish 中的示例来解释我想要什么。
-
您的示例输入数据很好。也许只是给出一个输出数据格式的例子,我们可以建议使用方法