我有“cbind”ed 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]))
}
因此,您可以看到我正在尝试从前两列下降的连续值中获取斜率。我的问题是我不知道如何使这个函数迭代整个矩阵并对每个列对执行相同的操作。 有什么提示吗?
答案 0 :(得分: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))
答案 1 :(得分:0)
避免循环并使用一些函数式编程,如diff
和paste
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