行文件的数量" Functions.txt"是100000,喜欢这个:
7702 2
590 12
1673 12
4782 12
9590 12
824 14
2292 14
2968 14
5560 14
199 15
5926 15
6654 15
3853 16
197 18
1418 18
1879 18
...
如果第二列中的值相同,则提取第一列中的值。例如,第二列的前四行是相同的,第一列中的相应值被提取并执行以下操作:
data[590,1673]=1; data[1673,590]=1;
data[590,4782]=1; data[4782,590]=1;
data[590,9590]=1; data[9590,590]=1;
data[1673,4782]=1; data[4782,1673]=1;
data[1673,9590]=1; data[9590,1673]=1;
data[4782,9590]=1; data[9590,4782]=1;
R代码:
data <-as.data.frame(matrix(0, 10455, 10455))
d <- read.table("Functions.txt",head=FALSE)
n <- nrow(d)
for (i in 1:(n-1)){
for (j in i+1:n){
if (d[i,2]==d[j,2]){
data[d[j,1],d[i,1]] <-1 ; data[d[i,1],d[j,1]]<-1
}else{
break
}
}
}
save(data, file = "data2function.Rdata")
答案 0 :(得分:3)
你应该创建一个稀疏矩阵:
d <- read.table(text = " 7702 2
590 12
1673 12
4782 12
9590 12
824 14
2292 14
2968 14
5560 14
199 15
5926 15
6654 15
3853 16
197 18
1418 18
1879 18")
library(data.table)
library(Matrix)
setDT(d)
#create combinations per group
combs <- d[, if (.N > 1) as.data.table(t(combn(V1, 2))), by = .(g = V2)]
setnames(combs, c("g", "i", "j"))
#create a sparse matrix
M <- sparseMatrix(i = combs[["i"]], j = combs[["j"]],
dims = c(10455, 10455),
symmetric = TRUE)
#check result:
M[585:595, 1670:1680]
# [1,] . . . . . . . . . . .
# [2,] . . . . . . . . . . .
# [3,] . . . . . . . . . . .
# [4,] . . . . . . . . . . .
# [5,] . . . . . . . . . . .
# [6,] . . . | . . . . . . .
# [7,] . . . . . . . . . . .
# [8,] . . . . . . . . . . .
# [9,] . . . . . . . . . . .
#[10,] . . . . . . . . . . .
#[11,] . . . . . . . . . . .
M[1670:1680, 585:595]
如果你真的需要(你不应该),你可以很容易地将稀疏矩阵变换为密集矩阵(使用as.matrix
)。
答案 1 :(得分:1)
我不是100%明确你想要达到的目标。如果以下代码符合您的要求,请告诉我。
要避免嵌套的f
循环,可以在所有整数对上使用for
:
for (pair in combn(1:(n-1),2,,FALSE)) {
i <- pair[1]
j <- pair[2]
if (d[i,2]==d[j,2]) {
data[d[j,1],d[i,1]]<-1
data[d[i,1],d[j,1]]<-1
}
}
不确定它是否更快,我需要测试它。
另一个想法:
unique_col_2 <- unique(d[,2])
values_col_1 <- lapply(X = unique_col_2,
FUN = function(v) { d[d[,2] == v,1] })
for (values in values_col_1) { ... }
因此,values_col_1
的每个元素都应该是$ d [,1] $的值向量,它们具有相同的“列2”值。然后,在...
中,使用上面的combn
技巧来检查所有这些值对并修改data
(现在您不必使用if
测试)