我在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函数中找不到行名和列名。任何帮助将不胜感激。
任何比我想的更有效的方式都值得欢迎。
答案 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))