我有一个以下问题,我有一个数据帧(df):
df <- data.frame(inp = c("inp1", "inp2", "inp3"), A = c(1,2,3), B = c(1,2,3))
我需要从这个数据帧构造一个inp * inp方阵,该矩阵符合对角线和非对角元素的某些公式。
对角线元素计算为M [i,i] = A [i,i] ^ 2 + B [i,i],非对角线元素为M [i,j] = A [i] * A [j]其中i,j属于集合(inp1,inp2,inp3)。
这是我到目前为止所得到的 - 计算非对角线值的功能仍然让我感到厌烦。
matFun <- function(df){
x <- matrix(,
nrow = nrow(df),
ncol = nrow(df),
dimnames = list(df$inp, df$inp))
#funOffDiag <- ???
funDiag <- function(A,B){A^2 + B}
d <- apply(df[c("A","B")], 1, function(y) funDiag(y["A"],y["B"]))
diag(x) <- d
x
}
matFun(df)
我需要将此解决方案作为一个函数,因为我必须将它应用于冗长的数据帧列表。
答案 0 :(得分:2)
df <- data.frame(inp = c("inp1", "inp2", "inp3"), A = c(1,2,3), B = c(1,2,3))
mat <- tcrossprod(df$A)
colnames(mat) <- rownames(mat) <- df$inp
diag(mat) <- diag(mat) + df$B
# inp1 inp2 inp3
#inp1 2 2 3
#inp2 2 6 6
#inp3 3 6 12
你应该能够自己创建一个函数......