スパース行列を使用すると、問題が解決する可能性があります。ここで、あなたはacutally複数のpossiblitiesを持って投影を行うには
# Load tiny toy data as edgelist
df <- data.frame(person =
c('Sam','Sam','Sam','Greg','Tom','Tom','Tom','Mary','Mary'), group =
c('a','b','c','a','b','c','d','b','d'), stringsAsFactors = F)
# Transform data to a sparse matrix
library(Matrix)
A <- spMatrix(nrow=length(unique(df$person)),
ncol=length(unique(df$group)),
i = as.numeric(factor(df$person)),
j = as.numeric(factor(df$group)),
x = rep(1, length(as.numeric(df$person))))
row.names(A) <- levels(factor(df$person))
colnames(A) <- levels(factor(df$group))
は2つです:
# Use base r
Arow <- tcrossprod(A)
# Alternatively, if you want to project on the other mode:
Acol <- tcrossprod(t(A))
# Use the igraph package, which works with sparse matrices
library(igraph)
g <- graph.incidence(A)
# The command bipartite.projection does both possible projections at once
proj <- bipartite.projection(g)
#proj[[1]]
#proj[[2]]
ます。また、データに読み込みとdata.table
を使用してspMatrix
コマンド内変換を行うことができ、これますそれらの操作も高速化します。
UPDATE:ここ
が大きく、グラフや一部のメモリベンチマークとの例である:ここでは
# Load packages
library(data.table)
library(igraph)
# Scientific collaboration dataset
# Descriptives as reported on https://toreopsahl.com/datasets/#newman2001
# mode 1 elements: 16726
# mode 2 elements: 22016
# two mode ties: 58595
# one mode ties: 47594
d <- fread("http://opsahl.co.uk/tnet/datasets/Newman-Cond_mat_95-99-two_mode.txt",
stringsAsFactors=TRUE, colClasses = "factor", header=FALSE)
# Transform data to a sparse matrix
A <- spMatrix(nrow=length(unique(d[, V1])),
ncol=length(unique(d[, V2])),
i = as.numeric(d[, V1]),
j = as.numeric(d[, V2]),
x = rep(1, length(as.numeric(d[, V1]))))
row.names(A) <- levels(d[, V1])
colnames(A) <- levels(d[, V2])
#To do the projection you have acutally multiple possiblities, here are two:
# Use base r
Arow <- tcrossprod(A)
# Alternatively, if you want to project on the other mode:
Acol <- tcrossprod(t(A))
は疎行列アプローチは私に取り組んすなわち、慣れてどのくらいのメモリ概要ですこのネットワークのラップトップを使用していましたが、通常の行列を使用するアプローチでは、メモリからBcol
オブジェクトを削除してからrm(Brow)
でオブジェクトを削除してからガベージコレクタgc()
を呼び出した後でも、メモリ割り当てエラーが発生しました
object.size(A) # Spare matrix: 3108520 bytes
object.size(Arow) # 2713768 bytes
object.size(Acol) # 5542104 bytes
# For comparison
object.size(B <- as.matrix(A)) # Regular matrix: 2945783320 bytes
object.size(Brow <- tcrossprod(B)) # 2239946368 bytes
object.size(Bcol <- tcrossprod(t(B))) # Memory allocation error on my laptop
こんにちは@majom、 'graph.incidence'の' mode'パラメータを使ってみましたが、これは投影のタイプを制御しません。ヘルプファイルごとに、 'mode'は有向グラフのエッジの方向を定義します。 'tcrossprod'を使用すると、1モードグラフを作成するために使用できる疎行列が得られますが、そうしようとすると、メモリ不足の問題でまったく同じ問題が発生します。 – timothyjgraham
私のせいで、 'bipartite.projection'というコマンドを追加しました。このコマンドは' igraph'で投影を行います。メモリ不足問題の短期的な解決策(超優秀ではありません)は、EC2に行って大きなメモリインスタンスを取得し、RStudioサーバー(http://www.louisaslett.com/)で分析します。 RStudio_AMI/video_guide.html – majom
@timothyjgraham:疎な行列があなたの正確な問題を解決する方法を示す例を追加しました。この例のネットワークサイズは、あなたのものほど大きくはありませんが、「重要」です。別のアプローチを試してみるには、 'rm()'と 'gc()'を使ってメモリをきれいにすることを確認してください。また、新しいアプローチを試してみると、Rセッションを再起動することもできます。 – majom