在R中的apply语句中引用列名和行名

时间:2018-10-29 11:29:32

标签: r

我在R中有一个数据框,看起来像下面的数据框。

    a b c d e f
    0 1 1 0 0 0
    1 1 1 1 0 1
    0 0 0 1 0 1
    1 0 0 1 0 1
    1 1 1 0 0 0

数据库很大,跨越100列和5000行,并且包含所有二进制文件(0和1)。我想在R中的每一列之间构造一个重叠部分。类似于下面给出的内容。此重叠数据帧将是一个正方形矩阵,行和列的数目相等,并且将与第一个数据帧中的列数相同。

      a b c d e f
    a 3 2 2 2 0 2
    b 2 3 3 3 0 1
    c 2 3 3 1 0 1
    d 2 3 1 3 0 3
    e 0 0 0 0 0 0
    f 2 1 1 3 0 3

第二个数据帧的每个单元格由第一个数据帧中行和列均为1的情况填充。

我正在考虑构造一个像这样的空矩阵:

    df <- matrix(ncol = ncol(data), nrow = ncol(data))
    colnames(df) <- names(data)
    rownames(df) <- names(data)

..并使用一条apply命令遍历此矩阵的每个单元,读取相应的行名(例如x)和列名(例如y),然后运行类似下面的函数。

    summation <- function (x,y) (return (sum(data$x * data$y)))

问题是在apply函数中找不到行名和列名。任何帮助将不胜感激。

任何比我想的更有效的方式都值得欢迎。

1 个答案:

答案 0 :(得分:1)

您正在寻找crossprod

crossprod(as.matrix(df1))
#  a b c d e f
#a 3 2 2 2 0 2
#b 2 3 3 1 0 1
#c 2 3 3 1 0 1
#d 2 1 1 3 0 3
#e 0 0 0 0 0 0
#f 2 1 1 3 0 3

数据

df1 <- structure(list(a = c(0L, 1L, 0L, 1L, 1L), b = c(1L, 1L, 0L, 0L, 
1L), c = c(1L, 1L, 0L, 0L, 1L), d = c(0L, 1L, 1L, 1L, 0L), e = c(0L, 
0L, 0L, 0L, 0L), f = c(0L, 1L, 1L, 1L, 0L)), .Names = c("a", 
"b", "c", "d", "e", "f"), class = "data.frame", row.names = c(NA, 
-5L))