如何加速以下R代码

时间:2016-01-12 07:54:53

标签: r

行文件的数量" 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")

2 个答案:

答案 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测试)