从 data.frame 或 data.table 构建方形邻接矩阵

2023-11-25

我正在尝试建立一个方形邻接matrix from a data.table。 这是我已经拥有的可重现的示例:

require(data.table)
require(plyr)
require(reshape2)
# Build a mock data.table
dt <- data.table(Source=as.character(rep(letters[1:3],2)),Target=as.character(rep(letters[4:2],2)))
dt
#   Source Target
#1:      a      d
#2:      b      c
#3:      c      b
#4:      a      d
#5:      b      c
#6:      c      b
sry <- ddply(dt, .(Source,Target), summarize, Frequency=length(Source))
sry
#  Source Target Frequency
#1      a      d         2
#2      b      c         2
#3      c      b         2
mtx <- as.matrix(dcast(sry, Source ~ Target, value.var="Frequency", fill=0))
rownames(mtx) <- mtx[,1]
mtx <- mtx[,2:ncol(mtx)]
mtx
#  b   c   d
#a "0" "0" "2"
#b "0" "2" "0"
#c "2" "0" "0"

现在,这非常接近我想要得到的,除了我希望所有节点都以两个维度表示,例如:

  a b c d
a 0 0 0 2
b 0 0 2 0
c 0 2 0 0
d 0 0 0 0

请注意,我正在处理相当大的数据,所以我想为此找到一个有效的解决方案。

感谢您的帮助。


解决方案(编辑) :

考虑到所提供解决方案的质量和数据集的大小,我对所有解决方案进行了基准测试。

#The bench was made with a 1-million-row sample from my original dataset
library(data.table)
aa <- fread("small2.csv",sep="^")
dt <- aa[,c(8,9),with=F]
colnames(dt) <- c("Source","Target")
dim(dt)
#[1] 1000001       2
levs <- unique(unlist(dt, use.names=F))
length(levs)
#[1] 2222

给定此数据,所需的输出是一个 2222*2222 矩阵(2222*2223 解决方案,其中第一列包含行names显然也是可以接受的)。

# Ananda Mahto's first solution
am1 <- function() {
    table(dt[, lapply(.SD, factor, levs)])
}
dim(am1())
#[1] 2222 2222

# Ananda Mahto's second solution
am2 <- function() {
    as.matrix(dcast(dt[, lapply(.SD, factor, levs)], Source~Target, drop=F, value.var="Target", fun.aggregate=length))
}
dim(am2())
#[1] 2222 2223

library(dplyr)
library(tidyr)
# Akrun's solution
akr <- function() {
    dt %>%
       mutate_each(funs(factor(., levs))) %>%
       group_by(Source, Target) %>%
       tally() %>%
       spread(Target, n, drop=FALSE, fill=0)
}
dim(akr())
#[1] 2222 2223

library(igraph)
# Carlos Cinelli's solution
cc <- function() {
    g <- graph_from_data_frame(dt)
    as_adjacency_matrix(g)
}
dim(cc())
#[1] 2222 2222

基准测试的结果是……

library(rbenchmark)
benchmark(am1(), am2(), akr(), cc(), replications=75)
#    test replications elapsed relative user.self sys.self user.child sys.child
# 1 am1()           75  15.939    1.000    15.636    0.280          0         0
# 2 am2()           75 111.558    6.999   109.345    1.616          0         0
# 3 akr()           75  43.786    2.747    42.463    1.134          0         0
# 4  cc()           75  46.193    2.898    45.532    0.563          0         0

听起来你只是在寻找table,但您应该确保两列具有相同的因子水平:

levs <- unique(unlist(dt, use.names = FALSE))
table(lapply(dt, factor, levs))
#       Target
# Source a b c d
#      a 0 0 0 2
#      b 0 0 2 0
#      c 0 2 0 0
#      d 0 0 0 0

我不知道它是否会提供任何速度改进,但您也可以使用dcast来自“数据.表”:

dcast(lapply(dt, factor, levs), Source ~ Target, drop = FALSE,
      value.var = "Target", fun.aggregate = length)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 data.frame 或 data.table 构建方形邻接矩阵 的相关文章

  • 计算带状矩阵的 colCumsums 的更快替代方案

    我是 R 和 stats 的新手 在我当前工作的领域中 我需要以独特的方式计算累积列总和 最初提供宽度为 b 行数为 n 的方带矩阵 例如 n 8 且 b 3 0 1 2 7 0 0 0 0 0 0 3 6 7 0 0 0 0 0 0 3
  • 删除ggplot2 geom_bar中没有数据的日期列[重复]

    这个问题在这里已经有答案了 我想隐藏 ggplot2 中没有数据的列 这是使用 nycflights13 库的可重现示例 library nycflights13 library dplyr library ggplot2 small da
  • R中的引用调用(使用函数修改对象)

    我刚刚接触 R 很惊讶地发现函数不会修改对象 至少看起来这是默认的 例如 我编写了一个函数 只是为了在表格中的一个标签上粘贴一个星号 它在函数内部工作 但表本身没有改变 我主要来自Ruby 那么 在 R 中使用函数更改对象的正常 可接受的方
  • rle 命令帮助

    我在使用 rle 命令时遇到了一些麻烦 该命令旨在找到参与者连续达到 8 个连续参与者的点 例如 如果 x lt c 0 1 0 1 1 1 1 1 1 1 1 1 我想返回值 11 感谢 DWin 我一直在使用这段代码 which rle
  • R - 对矩阵的每行/列应用具有不同参数值的函数

    我试图将函数应用于矩阵的每一行或每一列 但我需要为每一行传递不同的参数值 我以为我熟悉 lapply mapply 等 但可能还不够 举个简单的例子 gt a lt matrix 1 100 ncol 10 gt a 1 2 3 4 5 6
  • R 如何按行值进行分组、拆分或子集

    这是上一个问题的延续R 如何按行值分组 分裂 https stackoverflow com questions 64602607 r how to group by row value split 输入数据帧的变化是 id str c x
  • 寻找一种有效的方法来计算两个表中间隔集之间的重叠数量?

    注意 为了方便起见 我使用上一篇文章中的示例数据集 假设有两个数据集 ref and map 他们是 ref lt data table space rep nI 3 t1 c 100 300 500 t2 c 150 400 600 id
  • 按元素名称组合/合并列表

    我有两个列表 其元素的名称部分重叠 我需要将其逐个元素合并 组合成一个列表 gt lst1 lt list integers c 1 7 letters letters 1 5 words c two strings gt lst2 lt
  • R tidyr regex:从字符列中提取有序数字

    假设我有一个像这样的数据框 df lt data frame x c This script outputs 10 visualizations This script outputs 1 visualization This script
  • R 版本 4.0.0 上的 ROracle

    当尝试使用 ROracle 时 我收到以下错误消息 gt library ROracle Error package or namespace load failed for ROracle package ROracle was inst
  • 基于 dplyr 中的向量创建新列

    With dplyr使用以下命令可以轻松创建新列mutate df lt data frame v1 1 3 v2 c a b c gt mutate df newcol NA v1 v2 newcol 1 1 a NA 2 2 b NA
  • R data.table 中的复杂求和涉及查看其他列

    我有一个数据表 其中变量的每个值v1 and v2有一个关联的 类型 在单独的列中编码 这是一个 MWE X lt data table id 1 5 group c 1 1 2 2 2 v1 c 10 12 14 16 18 type v
  • R 中的多面点阵图,例如线框:如何删除条带并添加 1 行字幕

    我使用这种功能 来自iris数据集 model test lt lm Sepal Length Petal Length Sepal Width Petal Width Species 2 data iris gg lt expand gr
  • 通过 read.big.matrix 读取 R 中的大数据

    我正在使用 r 读取尺寸为 3131875 5 的数据read big matrix 我的数据既有字符列又有数字列 包括日期变量 我应该使用的命令是 as1 lt read big matrix C Documents and Settin
  • 如何修剪 R 向量?

    我有以下排序向量 gt v 1 1 0 1 2 4 5 2 3 4 5 7 8 5 6 7 8 10 11 如何删除 1 0 和 11 条目无需循环整个向量 使用用户循环还是隐式使用语言关键字 也就是说 我想修剪每个向量edge并且仅在每个
  • 优化对绑定到 DataGridView 的 DataTable 的更新

    我的应用程序中有一个显示一些数据的表单 当我第一次显示表单时 我将一些数据加载到 DataTable 中 然后将 DataTable 绑定到 DataGridView 我还启动了一个异步方法来执行一些较慢的数据库查询 当这些慢查询完成时 我
  • 如何为ggplot中的每个方面行添加y轴标题?

    我正在做一个散点图facet grid 像那样 library ggplot2 ggplot df aes x y geom point facet grid group1 group2 我想要 y 轴标题y像这样位于每一行的中间 绘制解决
  • 将代表扩展到矩阵?

    如果你打电话rep在矩阵上 它重复其元素而不是整个矩阵 传统的修复方法是调用rep list theMatrix 我想延长rep以便它自动执行此操作 我尝试使用 rep matrix lt function x rep list x 这确实
  • 在R中读写csv.gz文件

    有非常similar https stackoverflow com questions 9548630 read gzipped csv directly from a url in r关于这个主题的问题 但非在 R 下非常精确地处理这个
  • ggplot2条形图:按数据顺序填充

    给出这样的数据框 sam lt data table title c rep Cat 8 rep Dog 4 fcat c A B C B B C C B C B B C fnum c seq 8 1 seq 4 1 labeltext c

随机推荐

  • Ember.js 将现有记录克隆到存储中

    我正在努力思考 Ember js 会喜欢的概念 我想要的是以下内容 我现在有一个现有的 Ember 数据模型 名为Article 让我们说id共 1 个将显示在 article 1 当用户点击 新建 按钮时 他们将转换到 article n
  • 如何在 tkinter 窗口顶部添加问号 [?] 按钮

    我想为我的 python tkinter 项目创建一个窗口 该窗口顶部有一个问号按钮 如下所示 无论如何我可以做到这一点吗 我想我已经成功了 from PIL import Image ImageTk import tkinter as t
  • 哪个 haskell 库可以让我将 2D 数组/向量保存到 png/jpg/gif... 文件?

    我正在玩哈斯克尔 从简单的绘图程序开始 以弄湿我的脚 我需要一个库 可以让我将 2D 数组 向量保存到图像文件中 我不想写颜色列表 我想使用用于数组 向量之类的计算的容器 并且可以 嗯 almost 自动并行化 EDIT存储彩色图像的能力是
  • ModelForm 中的 DurationField 格式

    我有一个包含持续时间字段的 Django 模型 class Entry models Model duration models DurationField 我想使用 ModelForm 为该模型渲染一个表单 class EditEntry
  • 为什么 hash() 在 python3.4 下比 python2.7 慢

    我正在使用 timeit 进行一些性能评估 发现 python 2 7 10 和 python 3 4 3 之间的性能下降 我把范围缩小到hash 功能 蟒蛇2 7 10 gt gt gt import timeit gt gt gt ti
  • 在网页中添加Google搜索

    我想向静态网站添加搜索 最简单的方法是通过将 site www acme com 附加到实际查询中来简单地查询 Google 以便 Google 将搜索限制到该网站 理想情况下 我想在浏览器中执行此操作 以避免在服务器上安装 PHP 使用表
  • PySpark 根据名称将列表分解为多列

    您好 我正在处理一种稍微困难的文件格式 我正在尝试清理该格式以供将来处理 我一直在使用 Pyspark 将数据处理成数据帧 该文件看起来类似于 AA 1234 ZXYW BB A 890 CC B 321 AA 1234 LMNO BB D
  • 将文件夹从主包复制到 iPhone 中的文档目录

    我有一个应用程序 其中我的主包中有一个名为 Images 的文件夹 在此文件夹中还有另一个名为 Images1 的文件夹 其中包含一些图像 当我的应用程序启动时 我想要文档目录中的文件夹 图像 我想从文件夹 Images1 中获取图像 但我
  • 弦乐实习

    在下面的代码中 我正在检查对象引用的相等性 string x Some Text string y Some Other Text string z Some Text Console WriteLine object ReferenceE
  • 转换为 ARC - LLVM 编译器 3.0 错误

    我打开了我的一个旧项目并选择Convert to Objective C ARC从编辑 重构菜单 我收到以下错误 Apple LLVM compiler 3 0 Error Error in format of file Users myU
  • XPath:从子节点获取父节点

    我需要获取子节点的父节点title 50 目前我只使用 title 50 我怎样才能得到它的父母 结果应该是store node
  • 如何使用 Webpack 和 Angular2 包含外部 css 文件?

    我正在尝试使用 Webpack 添加对 Angular2 中 CSS 文件的外部引用 我的CSS定义为 test css loader style loader css loader 在我的 webpack config js 文件中 在打
  • Ruby:将转义字符串写入 YAML

    下列 require yaml test I m a b d string File open test yaml w do out out write test to yaml end 输出 this is a b d string 我怎
  • Lucene.Net 写/读同步

    我可以写 与IndexWriter 在打开阅读时将新文档放入索引 使用IndexReader 或者我必须在写作之前关闭阅读 我可以阅读 搜索文档吗 使用IndexReader 在索引中 当它打开用于写入时 与IndexWriter 或者我必
  • 扭曲应用程序的 Web 界面

    我有一个用 Twisted 编写的应用程序 我想添加一个 Web 界面来控制和监视它 我需要大量的动态页面来显示当前状态和配置 因此我希望有一个框架至少提供一种具有继承和一些基本路由的模板语言 因为我正在使用 Twisted 无论如何我想使
  • Firebase 更改显示在谷歌登录警报上的应用程序名称?

    我有一个 firebase 项目 但不知何故我输错了应用程序名称 有没有办法更改谷歌登录警报上显示的应用程序名称 您应该更改项目中的产品名称
  • 如何在 ASP.NET Core 中的自定义 TagHelper 中渲染 Razor 模板?

    我正在创建一个自定义 HTML 标记帮助程序 public class CustomTagHelper TagHelper HtmlAttributeName asp for public ModelExpression DataModel
  • 如何删除名称以“-”开头的文件[重复]

    这个问题在这里已经有答案了 在脚本中出现错误后 我最终得到了一个名称以破折号开头的文件 myfile txt 到目前为止我尝试过 rm myfile txt rm illegal option m usage rm f i dPRrvW f
  • 使用 this-> 访问成员是否有任何开销?

    当访问某个类的成员时 我可以使用例如 this gt myVar 10 或者我可以写 myVar 10 我喜欢用this gt 因为它显式声明该变量是此类的成员 但是与仅使用变量名本身相比 它是否会导致任何开销 作为替代方案 我可以向变量添
  • 从 data.frame 或 data.table 构建方形邻接矩阵

    我正在尝试建立一个方形邻接matrix from a data table 这是我已经拥有的可重现的示例 require data table require plyr require reshape2 Build a mock data