【问题标题】:iterate through matrix R遍历矩阵 R
【发布时间】:2016-02-12 00:41:55
【问题描述】:

我已经“cbind”了 2 个矩阵来制作矩阵“x”,这样每行的第一列就在一起了,第二列对也一样:

X1   Y1   X2   Y2    etc.   
val  val  val  val
val  val  val  val
val  val  val  val

在实际创建的矩阵中,列数比上例多得多。 我正在尝试遍历矩阵:

    for (i in 1:49){
       slope = atan((x[i+1,2]-x[i, 2])/(x[i+1,1]-x[i,1]))
    }

如您所见,我试图从前两列下降的连续值中获取斜率。我的问题是我不知道如何让这个函数遍历整个矩阵并对每一列对做同样的事情。 有什么建议吗?

【问题讨论】:

  • for (i in 1:49) 49 是因为每列有 50 行

标签: r for-loop matrix iterator


【解决方案1】:

第一步是逐列查找每个元素之间的差异。然后我们应用斜率函数。 (为了比较结果,使用了@latemail 的示例矩阵)。

diffs <- apply(x, 2, function(x) x[-1]-x[-length(x)])
atan(diffs[,c(F,T)]/diffs[,c(T,F)])
#             Y1       Y2
# [1,] 0.7853982 1.249046
# [2,] 1.1071487 1.325818
# [3,] 1.3258177 1.446441
# [4,] 1.4464413 1.508378

混合两个答案的单线解决方案怎么样:)

atan(diff(x)[,c(F,T)]/diff(x)[,c(T,F)])

数据

x <- cbind(X1=1:5,Y1=c(1,2,4,8,16),X2=1:5,Y2=c(1,4,8,16,32))

【讨论】:

  • 哇,谢谢!但是我的矩阵被称为“x”所以我将“mat”更改为“x”我可以摆脱它吗?当我运行命令时,它显示错误:dim(x) must have a positive length
  • @Chris 我没有你的数据,它可以是任何东西。我提供的示例是为了向您展示它的工作原理。是的,您可以更改名称。
【解决方案2】:

避免循环并使用一些函数式编程,如diffpaste

x <- cbind(X1=1:5,Y1=c(1,2,4,8,16),X2=1:5,Y2=c(1,4,8,16,32))
x

#     X1 Y1 X2 Y2
#[1,]  1  1  1  1
#[2,]  2  2  2  4
#[3,]  3  4  3  8
#[4,]  4  8  4 16
#[5,]  5 16  5 32

dfx <- diff(x)
atan(dfx[,paste0("X",1:2)]) / dfx[,paste0("Y",1:2)]

#            X1       X2
#[1,] 0.7853982 1.249046
#[2,] 1.1071487 1.325818
#[3,] 1.3258177 1.446441
#[4,] 1.4464413 1.508378

【讨论】:

  • 哇,看起来不错。但它返回:dfx
  • @Chris - 不,它没有。我拥有的代码是可重现且完整的。请在新的 R 会话中尝试。
猜你喜欢
  • 2013-04-07
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2018-02-16
相关资源
最近更新 更多