我试图在R中取一些值。我不是一个经验丰富的编程。
我有一个以特定方式搜索矩阵的功能。这是矩阵:
k2=c(3,6,4,NA,NA,NA,NA)
k3=c(2,7,5,NA,NA,NA,NA)
k4=c(7,9,5,2,1,8,12)
df2=data.frame(k2,k3,k4)
m2=as.matrix(df2)
m2
k2 k3 k4
[1,] 3 2 7
[2,] 6 7 9
[3,] 4 5 5
[4,] NA NA 2
[5,] NA NA 1
[6,] NA NA 8
[7,] NA NA 12
在k4行中查找值的主要想法。如果该行的值不相同, 该函数应该检查同一行中的值,然后转到这些行 找到价值。
因此,如果该值小于[1,k4]中的val,那么它应该将同一行中的第二列值([1,k3])作为要行的行号并检查第三列中的值该行中的列[行的值,3]。如果值越大,它应该和以前一样,但是[1,k2]。如果该值再次不是所需的值,则应再次检查并重复下一行的相同过程,直到获得匹配为止。
示例:
所以如果我需要val = 5那么它应该检查它是否与[1,k4]相同的值是7而它不是,它应该进入第三次低检查[3,k4]并且当你可以看到它是相同的,这意味着它将打印5.如果我需要我需要的值是12,那么如果逻辑应该是这样的:val与7不一样,所以转到第三行,检查9,哦,它不是相同的值,我会去7行,那就是,它相同的val,我会打印然后......
到目前为止我的代码/我的进度
我知道我必须每列时间搜索第三个,所以这意味着从第一个
开始for (i in df2[1,3])
然后检查该列中的每个值是否不等于val:
if (!i == val)
这对我来说是棘手的部分。我知道我必须检查它是否更少或更大,这意味着它应该以某种方式像这样
if (!i == val)
#then check if its less, if yes, go that row
#if it greater then go then go that row
# go to that row and check the same thing there
我不知道该怎么做,所以它会为每一行重复,直到找到val中的值。我知道我可以将较小值的行作为n-2,将较大值的行作为n-1,但我在这里努力使其工作。正如我所说,我对编程的经验很少。
非常感谢!
我真的需要帮助。
答案 0 :(得分:0)
我将重新陈述你的问题,以便我们确定我们在一起。
我们有一个要查找的值,以及一个要查看的矩阵。矩阵就像一张地图:它给出了方向。我们从第一行开始,并与k4
列进行比较。
k4
列,我们就完成了,成功了!k4
列,请转到k2
列指示的行号。k4
列,请转到k3
列指示的行号。 正如你所说,它必须“为每一行重复自己,直到它找到值”。由于我们不知道有多少重复,因此我们必须使用while
循环,而不是for
循环。 while
循环将继续尝试,直到完成。 (这很危险,因为如果它没有找到答案,它会继续尝试!所以如果尝试时间过长,我们可能会停止运行。)
k2=c(3,6,4,NA,NA,NA,NA)
k3=c(2,7,5,NA,NA,NA,NA)
k4=c(7,9,5,2,1,8,12)
m2 = cbind(k2, k3, k4)
my_search = function(value, matrix) {
current.row = 1
try.counter = 1
while(value != matrix[current.row, 3]) {
if (value < matrix[current.row, 3]) {
current.row = matrix[current.row, 1]
}
if (value > matrix[current.row, 3]) {
current.row = matrix[current.row, 2]
}
# This is the condition to stop if we can't find an answer
# To keep the algorithm from getting caught in a circle.
if (try.counter > 1e6) stop("Couldn't find an answer :(")
try.counter = try.counter + 1
}
cat(paste("The successful row number is", current.row, "\n"))
cat("It's values are:\n")
print(matrix[current.row, ])
}
用法示例:
> my_search(12, m2)
k2 k3 k4
NA NA 12
> my_search(5, m2)
k2 k3 k4
4 5 5
如果您希望能够分配函数的输出,则应该在函数中添加另一行,指定要返回的内容,例如: return(matrix[current.row, ])
。