Jis*_*ika 8 r block matrix diagonal
df<- data.frame(a=c(1:10), b=c(21:30),c=c(1:10), d=c(14:23),e=c(11:20),f=c(-6:-15),g=c(11:20),h=c(-14:-23),i=c(4:13),j=c(1:10))
Run Code Online (Sandbox Code Playgroud)
我想应用两个函数,一个是块对角线的正弦函数,第二个是其他元素的余弦函数并生成相同结构的数据框。
sin(df[1:2,1:2])
sin(df[3:5,3:5])
sin(df[6:10,6:10])
cos(the rest of the elements)
Run Code Online (Sandbox Code Playgroud)
1) 外/算术创建一个逻辑块对角矩阵,指示当前单元格是否在块对角线上,然后使用它来获取 sin 和 cos 值的凸组合,如下所示:
v <- rep(1:3, c(2, 3, 5))
ind <- outer(v, v, `==`)
ind * sin(df) + (!ind) * cos(df)
Run Code Online (Sandbox Code Playgroud)
2) ifelse或者,这给出了一个矩阵结果(或在上面使用 as.matrix )。ind 来自上面。
m <- as.matrix(df)
ifelse(ind, sin(m), cos(m))
Run Code Online (Sandbox Code Playgroud)
3) Matrix::bdiag另一种方法是在Matrix 包中使用bdiag(R 自带——无需安装)。
library(Matrix)
ones <- function(n) matrix(1, n, n)
ind <- bdiag(ones(2), ones(3), ones(5)) == 1
Run Code Online (Sandbox Code Playgroud)
现在按照 (1) 或 (2) 的最后一行继续操作。