在R中的两个值的指定范围内查找最大值
Look up maximum value in a specified range of two values in R
嗨,我是 R 的新手,一直在努力寻找解决方案来实现以下内容:
我有矩阵A(原始数据集):
df1 <- data.frame(i=1:5, Flow=c(.87,.49,.36,.83,.87))
df1
i Flow
1 1 0.87
2 2 0.49
3 3 0.36
4 4 0.83
5 5 0.87
我使用矩阵 A 创建的矩阵 B 显示 i 和 j 的不同组合及其匹配的 "Flow" 值 Si 和 Sj
列"Max Value"就是我想要的结果:
Matrix B - Modified Matrix & Required result - column "Max Value" image
MatrixB<-data.frame(i=c(1,1,1,2,2,3), j=c(3,4,5,4,5,5),
S_i=c(0.87,0.87,0.87,0.49,0.49,0.36),
S_j=c(0.36,0.83,0.87,0.83,0.87,0.87))
i j S_i S_j
1 1 3 0.87 0.36
2 1 4 0.87 0.83
3 1 5 0.87 0.87
4 2 4 0.49 0.83
5 2 5 0.49 0.87
6 3 5 0.36 0.87
具有最大值列的必需结果
i j S_i S_j Max
1 1 3 0.87 0.36 0.49
2 1 4 0.87 0.83 0.49
3 1 5 0.87 0.87 0.83
4 2 4 0.49 0.83 0.36
5 2 5 0.49 0.87 0.83
6 3 5 0.36 0.87 0.83
4.Using 矩阵 B 的第 2 行作为我正在尝试做的示例:
- i = 1对应Si=0.87
- j=4对应Sj=0.83
对于第 2 行,所需结果中的 'Max Value' 列显示等于 0.49
这是因为我正在查找矩阵 A 的第 2 列中的最大值,从大于 i=1 的行到小于 j=4 的行(即 max(0.49,0.36))
问题是在矩阵 A 的第 2 列中查找最大值的范围会随着每一行的变化而变化,并且由矩阵 B 中的 i 和 j 值定义。
我将如何实施?
抱歉,如果此问题已在其他地方得到解答,但我确实搜索了解决方案但找不到类似的查询。
提前致谢
涉及到几个步骤,包括索引对和最大值识别。最后我们必须把所有的东西都安排在一个有序的输出中:
cmb <- combn(df1$i, 2)
ind <- apply(cmb, 2, diff) > 1
fun <- function(x,y) max(df1$Flow[(.x <- x:y)[-c(1, length(.x))]])
values <- mapply(fun, cmb[1,ind], cmb[2,ind])
ij <- sij <- t(cmb[,ind])
sij[] <- df1$Flow[ij]
newdf <- cbind.data.frame(ij, sij, values)
names(newdf) <- c("i", "j", "Si", "Sj", "Max")
newdf
# i j Si Sj Max
# 1 1 3 0.87 0.36 0.49
# 2 1 4 0.87 0.83 0.49
# 3 1 5 0.87 0.87 0.83
# 4 2 4 0.49 0.83 0.36
# 5 2 5 0.49 0.87 0.83
# 6 3 5 0.36 0.87 0.83
嗨,我是 R 的新手,一直在努力寻找解决方案来实现以下内容:
我有矩阵A(原始数据集):
df1 <- data.frame(i=1:5, Flow=c(.87,.49,.36,.83,.87))
df1
i Flow
1 1 0.87
2 2 0.49
3 3 0.36
4 4 0.83
5 5 0.87
我使用矩阵 A 创建的矩阵 B 显示 i 和 j 的不同组合及其匹配的 "Flow" 值 Si 和 Sj
列"Max Value"就是我想要的结果:
Matrix B - Modified Matrix & Required result - column "Max Value" image
MatrixB<-data.frame(i=c(1,1,1,2,2,3), j=c(3,4,5,4,5,5),
S_i=c(0.87,0.87,0.87,0.49,0.49,0.36),
S_j=c(0.36,0.83,0.87,0.83,0.87,0.87))
i j S_i S_j
1 1 3 0.87 0.36
2 1 4 0.87 0.83
3 1 5 0.87 0.87
4 2 4 0.49 0.83
5 2 5 0.49 0.87
6 3 5 0.36 0.87
具有最大值列的必需结果
i j S_i S_j Max
1 1 3 0.87 0.36 0.49
2 1 4 0.87 0.83 0.49
3 1 5 0.87 0.87 0.83
4 2 4 0.49 0.83 0.36
5 2 5 0.49 0.87 0.83
6 3 5 0.36 0.87 0.83
4.Using 矩阵 B 的第 2 行作为我正在尝试做的示例:
- i = 1对应Si=0.87
- j=4对应Sj=0.83
对于第 2 行,所需结果中的 'Max Value' 列显示等于 0.49 这是因为我正在查找矩阵 A 的第 2 列中的最大值,从大于 i=1 的行到小于 j=4 的行(即 max(0.49,0.36))
问题是在矩阵 A 的第 2 列中查找最大值的范围会随着每一行的变化而变化,并且由矩阵 B 中的 i 和 j 值定义。
我将如何实施? 抱歉,如果此问题已在其他地方得到解答,但我确实搜索了解决方案但找不到类似的查询。
提前致谢
涉及到几个步骤,包括索引对和最大值识别。最后我们必须把所有的东西都安排在一个有序的输出中:
cmb <- combn(df1$i, 2)
ind <- apply(cmb, 2, diff) > 1
fun <- function(x,y) max(df1$Flow[(.x <- x:y)[-c(1, length(.x))]])
values <- mapply(fun, cmb[1,ind], cmb[2,ind])
ij <- sij <- t(cmb[,ind])
sij[] <- df1$Flow[ij]
newdf <- cbind.data.frame(ij, sij, values)
names(newdf) <- c("i", "j", "Si", "Sj", "Max")
newdf
# i j Si Sj Max
# 1 1 3 0.87 0.36 0.49
# 2 1 4 0.87 0.83 0.49
# 3 1 5 0.87 0.87 0.83
# 4 2 4 0.49 0.83 0.36
# 5 2 5 0.49 0.87 0.83
# 6 3 5 0.36 0.87 0.83