小结

我有一个表示拓Flutter 面的值矩阵.我正在计算每列y的精确等高线z的x值.

在深度上

我正在将实验数据与三维非线性衰减模型z(x,y)进行拟合. 我的分析的任何代码都需要适合许多不同的数据集.我已经成功地将模型参数化,并在给定x和y的每个整数值的情况下计算z.然后,我需要提取特定等高线的值. 每个变量的范围是x:(0>x>80);y:(0>y>100);z:(0&>;z>1).

require(pracma)
# Truncated matrix with demo data, normally created by fitting parameterized algorithm to 81x100 matrix
M <- matrix(c(0,1,1,1,1,1,1,1,1,
              0,0.843,1,1,1,1,1,1,1,
              0,0.484,0.907,1,1,1,1,1,1,
              0,0.218,0.459,0.721,0.978,1,1,1,1,
              0,0.082,0.185,0.313,0.461,0.621,0.781,0.925,1,
              0,0.029,0.066,0.113,0.171,0.242,0.323,0.414,0.511,
              0,0.010,0.022,0.038,0.058,0.082,0.112,0.146,0.186,
              0,0.003,0.008,0.013,0.020,0.028,0.037,0.049,0.062,
              0,0.001,0.003,0.004,0.007,0.009,0.012,0.016,0.021,
              0,0.000,0.001,0.001,0.002,0.003,0.004,0.006,0.007,
              0,0.000,0.000,0.001,0.001,0.001,0.001,0.002,0.002),ncol = 11)

# Extract Contours ----
X <- seq(from = 0, to = 80, by = 10) # normally by = 1 on full dataset
Y <- seq(from = 0, to = 100, by = 10)
z <- 0.8

FindZ <- function(x) interp2(X, Y, M, x, y)-z 

x_out <- matrix()

for(i in 1:11){
    y <- i*10 # adjusted for truncated dataset. Normally in increments of 1
    x <- fzero(FindZ, mean(X))
    x_out[i] <- x$x 
    print(x$x)
next}

我得到以下错误:

IF(FB==0)RETURN(LIST(x=b,Fval=FB))出错: 需要TRUE/FALSE的位置缺少值

我意识到并非所有行y包含的值都会超过我在任何给定时间寻找的z等值线.为了避免这种情况,我try 在较大的数据集上使用tryCatch().当我这样做时,我什么也得不到,比如说,循环迭代y[20],它成功地运行了大约15次迭代,然后我得到了相同的余额错误.问题是,我一直在有&gt;z值的行上得到这个结果,而内插出现了错误.我还交换了代码,并寻求值为xz的解y,得到了几乎完全相同的结果.

我不想将数据子集,因为我不想丢失绝对的x,y位置,因为它们与物理测量相对应.如果没有z值,我希望使用replace()为列放置一个0.

理想情况下,我想要一个值为(x,y)的矩阵,如果我反馈给原始函数,它们会计算到我的值z.任何指点都是很棒的.

推荐答案

我认为你是在试图重新发明轮子.您可以使用isoband程序包高效地实现您正在try 的操作,该程序包可以计算给定z值矩阵和x,y坐标向量的精确z值的x,y坐标:

result <- as.data.frame(isoband::isobands(Y, X, M, z, z)[[1]])

head(result)
#>          x        y id
#> 1 44.08998 80.00000  1
#> 2 44.08998 80.00000  1
#> 3 42.44618 70.00000  1
#> 4 40.00000 61.31944  1
#> 5 39.13242 60.00000  1
#> 6 35.27704 50.00000  1

我们可以通过用代表z值的 colored颜色 绘制网格来显示这一点,并将结果绘制为一条线.

library(ggplot2)

ggplot(reshape2::melt(M), aes(Y[Var2], X[Var1])) +
  geom_tile(aes(fill = value)) +
  geom_path(data = result, aes(x , y), col = "red")

reprex package(v2.0.1)在2022-08-08创建

R相关问答推荐

如何改变时间图R中的悬停信息?

LOF中的插图短文字幕

解析R函数中的变量时出现的问题

展开对数比例绘图的轴(添加填充)

过滤名称以特定字符串开头的文件

识别连接的子网(R-igraph)

在多页PDF中以特定布局排列的绘图列表不起作用

减go R中列表的所有唯一元素对

网络抓取新闻标题和时间

如果极点中存在部分匹配,则替换整个字符串

只有当我在循环的末尾放置一条print语句时,Foreach才会给出预期的输出

根据小时-分钟列创建年-月-日序列

使用条件格式R替换字符串中的字符

当某些ID的行数多于其他ID时,按ID对数据帧中的行进行采样

向量化sApply函数

防止在与coord_flip组合时在每个面中重复轴标签

如果可能的话,寻找一种更有效的方式来实现这个R代码

在RStudio中操作数组、特定的列和行求和

如何将`tabPanel`附加到`menuSubItem`?

R:使用For-Loop创建新列