小编Seb*_*Seb的帖子

如何使用R从具有多列的数据框中计算(共)发生矩阵?

我是 R 的新手,目前正在处理边缘列表形式的协作数据,该列表具有 32 列和大约 200.000 行。我想根据国家之间的相互作用创建一个(共)现矩阵。但是,我想通过对象的总数来计算交互次数。

期望结果的基本示例

如果在一行中“England”出现了 3 次而“China”只出现了一次,结果应该是下面的矩阵。

         England  China
England    3        3
China      3        1
Run Code Online (Sandbox Code Playgroud)

可重现的例子

df <- data.frame(ID = c(1,2,3,4), 
 V1 = c("England", "England", "China", "England"),
 V2 = c("Greece", "England", "Greece", "England"),
V32 = c("USA", "China", "Greece", "England"))
Run Code Online (Sandbox Code Playgroud)

因此,示例数据框当前看起来像这样:

ID  V1       V2       ...   V32
1   England  Greece         USA
2   England  England        China
3   China    Greece         Greece
4   England  England        England
.
.
.
Run Code Online (Sandbox Code Playgroud)

期望的结果

我想逐行计算(共)出现并且与顺序无关,以获得一个(共)出现矩阵,该矩阵说明边缘循环(例如英格兰 - 英格兰)的低频,这导致以下结果:

         China   England   Greece   USA

China    2        2         2 …
Run Code Online (Sandbox Code Playgroud)

r igraph adjacency-matrix find-occurrences dplyr

7
推荐指数
1
解决办法
1954
查看次数

如何基于大数据框计算共现矩阵?

我想根据这里推荐的代码创建一个共现矩阵(另见下文)。它适用于我使用的大多数数据帧。但是,如果我使用data.table::melt...

negative length vectors are not allowed

...或稍后使用 base::crossprod

error in crossprod: attempt to make a table with >=2^31 elements

两者都与数据帧的大小有关。在第一种情况下,它与行数有关,而在后一种情况下,矩阵的大小超过了限制。

我知道关于第一个问题(解决方案data.table::melt)提出的[2] [3][4] ,以及对于第二个问题(base::crossprod通过)[5][6] ,和我见过[ 7]但我不确定如何使它们适合我的情况。我试图按 ID 将数据帧拆分为几个数据帧,合并它们并计算共现矩阵,但我刚刚产生了额外的错误消息(例如,无法分配大小为 17.8 GB 的向量)。

可重现的例子

我有一个由plyr::join它创建的组装数据框,看起来像这样(但是,当然,要大得多):

df <- data.frame(ID = c(1,2,3,20000), 
                  C1 = c("England", "England", "England", "China"),
                  C2 = c("England", "China", "China", "England"),
                  C5850 = c("England", "China", "China", "England"),
                  SC1 = c("FOO", "BAR", "EAT", …
Run Code Online (Sandbox Code Playgroud)

r large-data plyr dataframe data.table

5
推荐指数
0
解决办法
186
查看次数