最近我开始使用R,我想用它将大型条件概率文件转换为基于信息变化的距离矩阵(参见:https://en.wikipedia.org/wiki/Variation_of_information和https://en.wikipedia.org/wiki/Mutual_information)这个和我发现我需要读一个相当大的平面文件(~35GB)的条件概率,其内容是:
1 7979 1
2 23243 0
23243 1 0.343
......
等等。我想要做的是读取数据并重新整形,使得我有一个表(或矩阵):
1 2 ... 7979 ... 23243 ...
1 z z z 1 z z ...
2 z z z z z 0 ...
... z z z z z z ...
7979 z z z z z z ...
... z z z z z z ...
23243 0.343 0 z z z z ...
其中z是平面文件的第三列。需要考虑的事情:
1)平面文件第三列中的大多数值都是0.
2)结果表是方形的,每行大约有50,000个条目。
3)一旦我加载了表格,每行必须多次求和,一次对所有元素求和,并且(#rows-1)^ 2次,每增加一次求和就省略一列。
任何想法都会很棒。我到目前为止唯一的想法是从预处理步骤中删除第三列等于零的平面文件中的所有行(awk这样做很好)然后尝试找到一个包来创建稀疏矩阵从平面文件中将其转换为R内的密集矩阵进行计算,但我没有太多运气(我知道dummy.matrix会做这样的事情,但我不知道如何使用它。)< / p>
答案 0 :(得分:1)
创建一个只有非零z
值的数据框(假设我们可以在导入数据之前从平面文件中删除所有零线)。
N <- 50000
S <- N * 0.8
df_input <- data.frame( x = sample(1:N, S), y = sample(1:N, S), z = runif(S))
# > head(df_input)
# v1 v2 value
# 1 35093 13107 0.6078230
# 2 46104 5201 0.1596800
# 3 21262 1943 0.9006491
# 4 10250 21508 0.6725270
# 5 41243 33452 0.7160704
# 6 17123 45607 0.5535252
使用Matrix包,我们可以表示稀疏矩阵:
# create sparse matrix
library(Matrix)
M1 <- sparseMatrix(i = df_input[,1], j = df_input[,2], x = df_input$z, dims = c(N,N))
# > dim(M1)
# [1] 50000 50000
对于较小的矩阵,我们通常会这样做:
# sum rows with i-th column excluded
# *warning: you need a memory for N*(N+1) matrix!*
result <- sapply(1:(N + 1), FUN = function(i) {
rowSums(M1[,-i])
})
但是可能无法在内存中创建N x(N + 1)矩阵。 M1
是稀疏的,但得到的N x(N + 1)矩阵充满了和值。现在怎么样?
嗯,这取决于如何使用总和。您始终可以从源M1
稀疏矩阵中获取排除列的行总和:
rsums <- function(M1, col_num) rowSums(M1[,-col_num])
没有i
列的总和:
rsums(M1, i)
第j
行没有i
列的总和:
rsums(M1, i)[j]