从数据框填充矩阵,其中包含对角线和非对角线元素的单独函数

时间:2015-06-05 12:13:28

标签: r matrix dataframe

我有一个以下问题,我有一个数据帧(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)

我需要将此解决方案作为一个函数,因为我必须将它应用于冗长的数据帧列表。

1 个答案:

答案 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

你应该能够自己创建一个函数......