r - 如何基于大数据帧计算共现矩阵?
问题描述
我想根据这里推荐的代码创建一个共现矩阵(另见下文)。它适用于我使用的大多数数据框。但是,如果我使用更大的数据帧,我会收到以下错误消息data.table::melt
......
negative length vectors are not allowed
...或稍后使用base::crossprod
error in crossprod: attempt to make a table with >=2^31 elements
两者都与数据框的大小有关。在第一种情况下,它与行数有关,而在后一种情况下,矩阵的大小超过了限制。
我知道[2]、[3]和[4]data.table::melt
提出的第一个问题 ( )以及[5]和[6]提出的第二个问题 ( ) 的解决方案,并且我已经看到[ 7]但我不确定如何使它们适合我的情况。我试图按 ID 将数据帧拆分为几个数据帧,合并它们并计算共现矩阵,但我刚刚产生了额外的错误消息(例如,无法分配大小为 17.8 GB 的向量)。base::crossprod
可重现的例子
我有一个由它创建的组装数据框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", "FOO"),
SC2 = c("MERCI", "EAT", "EAT", "EAT"),
SC5850 = c("FOO", "MERCI", "FOO", "FOO"))
ID C1 C2 ... C5850 SC1 SC2 ... SC5850
1 England England England FOO MERCI FOO
2 England China China BAR EAT MERCI
3 England China China EAT EAT EAT
200000 China England England FOO EAT FOO
原始代码
colnames(df) <- c(paste0("SCCOUNTRY", 2:7))
library(data.table)
melt(setDT(df), id.vars = "ID", measure = patterns("^SCCOUNTRY"))[nchar(value) > 0 & complete.cases(value)] -> foo
unique(foo, by = c("ID", "value")) -> foo2
crossprod(table(foo2[, c(1,3)])) -> mymat
diag(mymat) <- ifelse(diag(mymat) <= 1, 0, mymat)
条件(用于计算共现矩阵)
- 不考虑没有按 ID/行进行额外观察的单个观察,即只有一个国家的行被计为 0。
- 组合/共现应计为 1。
- 处于组合中也会导致计数为自组合(美国-美国),即分配值 1。
- 没有按行/ID 为组合分配超过 1 的值。
解决方案
推荐阅读
- javascript - 如何使用 JavaScript 为每两个数字添加空格?
- ios - Apple App Site Association 在 Postman 中工作,但不适用于在线验证器
- regex - bash 上的 grep 正则表达式/通配行为
- r - 为什么我没有得到 R 中带有 sum 函数的列的总数?
- c# - 如何使 C# 方法中的代码作用于计时器?
- python - Python Turtle 窗口的大小(以像素为单位)是多少?
- ios - 使用 Objective-C 语法的多个参数调用 Swift 函数
- javascript - 在不使用 innerHTML 的情况下将数据添加到 div
- flutter - 不允许在 android 10 中将图像保存到本地目录
- python - 由于 IndexError,光标无法更新字段