计算 R 中一个组中两个值同时出现的次数

2023-12-21

我搜索了这个问题的答案并发现了类似的答案(计算每组内的行数 https://stackoverflow.com/questions/9809166/count-number-of-rows-within-each-group, 计算 R 数据帧列中变量值的唯一组合 https://stackoverflow.com/questions/63062416/count-unique-combinations-of-variable-values-in-an-r-dataframe-column?noredirect, R 按组计数元素的出现次数 https://stackoverflow.com/questions/32586674/r-count-occurrences-of-an-element-by-groups)但他们都没有解决我的特定问题。

我有一个带有变量的数据框year, ID, and code。每个人都有一个ID并且可以有多个code(可能)多个过程中的值years.

df = data.frame(ID   = c(1,1,1,1, 2,2,2, 3, 4,4,4,4,4,4,4,4, 5,5,5),
                year = c(2018, 2018, 2020, 2020,
                         2020, 2020, 2020,
                         2011,
                         2019, 2019, 2019, 2019, 2020, 2020, 2020, 2020,
                         2018, 2019, 2020),
                code = c("A", "B", "C", "D",
                         "A", "B", "Q",
                         "G",
                         "A", "B", "Q", "G", "C", "D", "T", "S",
                         "S", "Z", "F")

)

df
   ID year code
1   1 2018    A
2   1 2018    B
3   1 2020    C
4   1 2020    D
5   2 2020    A
6   2 2020    B
7   2 2020    Q
8   3 2011    G
9   4 2019    A
10  4 2019    B
11  4 2019    Q
12  4 2019    G
13  4 2020    C
14  4 2020    D
15  4 2020    T
16  4 2020    S
17  5 2018    S
18  5 2019    Z
19  5 2020    F

我想要的是另一个数据框,给出两个不同值的次数code在以下组内同时发生ID and year(在这个例子中,A和B共出现3次,A和C共出现0次),然后我将用它来进行网络分析。

到目前为止我有这样的语法:

1:制作宽版数据

library(tidyverse)
wide = df %>% 
        group_by(year, ID) %>% 
        mutate(row = row_number()) %>% 
        ungroup() %>% 
        pivot_wider(
            id_cols = c(ID, year),
            names_from = row, 
            names_prefix = "code_", 
            values_from = code
        )

2:制作节点列表

nodes = distinct(df, code) %>% rowid_to_column("id")

3:制作边缘列表

#edge list needs to be three vars: source, dest, and weight
# source and dest are simply code names that (potentially) co-occur in the same year for an ID
# weight is the number of times the codes co-occurred in the same year for each ID.

#all combinations of two codes
edges = combn(x = nodes$code, m = 2 ) %>% 
    t() %>% 
    as.data.frame()

colnames(edges) = c("source", "dest")
edges$weight = NA_integer_


#oh, no! a for() loop! a coder's last ditch effort to make something work
for(i in 1:nrow(edges)){
    
    source = edges$source[i]
    dest = edges$dest[i]
    

    #get the cases with the first code of interest
    temp = df %>% 
        filter( code == source ) %>% 
        select(ID, year)
    
    #get the other codes that occurred for that ID in that year
    temp = left_join(temp, 
                     wide, 
                     by = c("ID", "year"))
    
    
    #convert to a logical showing if the other codes are the one I want
    temp = temp %>% mutate_at(vars(starts_with("code_")),
                            function(x){ x == dest }
    ) 
    
    #sum the number of times `source` and `dest` co-occurred
    temp$dest = temp %>% select(starts_with("code_")) %>% rowSums(., na.rm=TRUE)
    edges$weight[i] = sum(temp$dest, na.rm = TRUE)
    
}

编辑以添加结果:

Result:

edges
   source dest weight
1       A    B      3
2       A    C      0
3       A    D      0
4       A    Q      2
5       A    G      1
6       A    T      0
7       A    S      0
8       A    Z      0
9       A    F      0
10      B    C      0
11      B    D      0
12      B    Q      2
13      B    G      1
14      B    T      0
15      B    S      0
16      B    Z      0
17      B    F      0
18      C    D      2
19      C    Q      0
20      C    G      0
21      C    T      1
22      C    S      1
23      C    Z      0
24      C    F      0
25      D    Q      0
26      D    G      0
27      D    T      1
28      D    S      1
29      D    Z      0
30      D    F      0
31      Q    G      1
32      Q    T      0
33      Q    S      0
34      Q    Z      0
35      Q    F      0
36      G    T      0
37      G    S      0
38      G    Z      0
39      G    F      0
40      T    S      1
41      T    Z      0
42      T    F      0
43      S    Z      0
44      S    F      0
45      Z    F      0

这给了我我想要的(一个数据框显示A和B共出现3次,A和C共出现0次,A和D共出现0次,A和G共出现1次,A和Q共出现1次) -发生2次,等等...)。所以这可行,但即使对于这个小例子也需要一两秒钟。我的真实数据集约为 3,000,000 个观察值。我让它运行了一段时间,但停下来却发现它已经完成了约 1%。

有更好/更快的方法来做到这一点吗?


这是一种替代方案,它只进行连接,因此对于大数据来说可能非常快。

library(data.table)
setDT(df)
df[df, on = c('ID','year'), allow.cartesian = TRUE][
  code<i.code, .N, .(pair = paste0(code, i.code))]

#>     pair N
#>  1:   AB 3
#>  2:   CD 2
#>  3:   AQ 2
#>  4:   BQ 2
#>  5:   GQ 1
#>  6:   AG 1
#>  7:   BG 1
#>  8:   CT 1
#>  9:   DT 1
#> 10:   ST 1
#> 11:   CS 1
#> 12:   DS 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 R 中一个组中两个值同时出现的次数 的相关文章

  • 设置rgl设备的大小

    我的 rgl 设备的全屏 非全屏有问题 目前我使用R 3 00 我将 persp3d 图 库 rgl 绘制到我的设备中 它在一个非常小的窗口中打开 R代码 persp3d x y z theta 50 phi 25 expand 0 75
  • 创建超过 2 组的高图表密度

    我尝试用两个以上的组创建高图表密度 我找到了一种手动将它们逐一添加的方法 但必须有更好的方法来处理组 示例 我想创建一个类似于下面的ggplot图表的highchart 而不需要将它们一一添加 有什么办法可以做到吗 d f lt data
  • 多项式混合 Logit 模型 mlogit r-package

    我发现了mlogit package https cran r project org web packages mlogit index html对于多项 Logit 模型 寻找估计多项混合 Logit 模型 在阅读了精彩的小插图后 我发
  • R 中从右到左的运算符结合性可能吗?

    我是 R 新手 我刚刚发现我患有支架恐惧症 https mathematica stackexchange com a 17315 2266 请参阅链接中的评论 我喜欢这种方式magrittr符号 gt 有效 因为它在某些情况下避免了嵌套括
  • R模糊字符串匹配根据匹配的字符串返回特定列

    我有两个大型数据集 一个大约有 50 万条记录 另一个大约有 7 万条记录 这些数据集有地址 我想匹配较小数据集中的任何地址是否存在于大数据集中 正如您所想象的那样 地址可以用不同的方式和不同的情况 拼写等来书写 此外 如果只写到建筑物级别
  • 将选择标准添加到 read.table

    让我们采用以下我导入的数据集的简化版本read table a lt as data frame c M M F F F b lt as data frame c 25 22 33 17 18 df lt cbind a b colname
  • 在批处理模式下运行 R - 打印到屏幕?

    跑步时 R CMD BATCH options filename r 我想控制输出的打印位置 我可以使用以下命令抑制 Rout 文件的创建 R CMD BATCH options filename r dev null 但是否可以将输出直接
  • R 从 .CSV 创建 NetCDF

    我正在尝试从 csv 文件创建 NetCDF 我在这里和其他地方读过一些教程 但仍然有一些疑问 我有一个这样的表 lat long time rh temp 41 109 6 1 1 40 107 18 2 2 39 105 6 3 3 4
  • 如何绘制两个 ggplot 密度分布之间的差异?

    我想使用 ggplot2 来说明两个相似密度分布之间的差异 这是我拥有的数据类型的玩具示例 library ggplot2 Make toy data n sp lt 100000 n dup lt 50000 D lt data fram
  • 用整数矩阵对 data.frame 进行子集化

    我一直遇到这个问题 想知道是否有一个简单的解决方法 对于某些情况 我发现考虑将矩阵子集化更合乎逻辑 N lt 12 N NA lt 6 dat lt data frame V1 runif N V2 runif N sel mat lt m
  • 如何避免循环

    大家好 我是 R 新手 我有两个面板数据文件 其中包含 id date 和 ret 列 文件 A 的数据比文件 B 多得多 但我主要处理文件 B 数据 id 和 date 的组合是唯一标识符 有没有一种优雅的方式来查找 B 中的每个 id
  • R 中第三维的平均值

    R中是否有任何快速方法或内置函数来计算基于第三维的平均值 例如我的数组是 1 1 2 1 1 3 2 2 4 2 1 2 1 11 13 2 12 14 3 1 2 1 21 23 2 22 24 我的输出是 1 2 1 mean 1 11
  • 在开发模式下安装包(R源未编译成Rdb)

    我需要修改R代码在一个R具有 Fortran 绑定的包 当我安装软件包时 我看到存储库目录没有源代码 但是 Rdb而是二进制文件 我看了看devtools包 但我仍然不清楚如何在不编译 R 源部分的情况下安装该包 类似于 python py
  • R 中的优化函数可以接受目标、梯度和粗麻布吗?

    我有一个想要优化的复杂目标函数 优化问题需要相当长的时间来优化 幸运的是 我确实有可用的函数的梯度和粗麻布 R 中是否有一个优化包可以接受所有这三个输入 optim 类不接受 Hessian 矩阵 我已经扫描了用于优化的 CRAN 任务页面
  • R 语言 - 等待用户使用 scan 或 readline 输入

    我试图让用户输入一些关键字进行查询 在我的脚本中我使用了 scan 或 readline 我使用 R 嵌入脚本编辑器 Windows 进行了尝试 但是当我执行代码时 它使用我的下一行脚本作为标准输入 这是我的 部分 脚本 keywords
  • 添加有关白天/黄昏/夜晚/黎明的信息以在 R 中跟踪数据

    我有一个数据集 其中包含几个月的日期时间 纬度和经度变量的跟踪数据 如下所示 gt start lt as POSIXct 2018 08 01 00 00 00 format Y m d H M S tz UTC gt datetime
  • 在闪亮的应用程序和多个页面中进行身份验证

    在我正在开发的系统中 我有 3 个不同的参与者 用户 管理员 支持团队 使用 Shiny App 我想知道如何向这三个参与者进行身份验证 每个参与者只能访问他们的页面 我发现使用闪亮的服务器专业版可以实现这一点 但它不是免费的 有什么方法可
  • 将值添加到 rCharts hPlot 工具提示

    我想通过 rCharts 向标准 Highcharts 工具提示添加一些额外的值 示例代码 require rCharts df lt data frame x c 1 5 y c 5 1 z c A B C D E name c K L
  • 更改 ggplot 条形图填充颜色

    有了这个数据 df lt data frame value c 20 50 90 group c 1 2 3 我可以得到一个条形图 df gt ggplot aes x group y value fill value geom col c
  • 当按多列分组时,如何命名 dplyr 中的 group_split 列表

    我在 dplyr 中使用 group split 在分割了多个列后 我很难命名列表 当我们按一列分组时 我知道该怎么做here https stackoverflow com questions 57107721 how to name t

随机推荐

  • reflog 过期并 gc prune 后推送到原点

    我使用以下命令删除了本地存储库中的一些无法访问和悬空的提交 git fsck unreachable dangling no reflogs git reflog expire expire now all git gc prune now
  • 如何使用react js在Fetch API中设置超时

    我在 React js 中使用 fetch post 方法 当向后端发送请求时 需要 7 分钟才能提供响应 然后前端会自动超时 你能帮我解决一下如何在 fetch 方法中设置 10 分钟的时间 让前端等待响应 并且只有当后端花费超过 10
  • 前缀/后缀增量运算符

    我想确保我正确理解按值传递与按引用传递 特别是 我正在查看增量的前缀 后缀版本 对象的运算符 假设我们有以下课程X class X private int i public X i 0 X operator i return this pr
  • 单选按钮在 Chrome 中显示不需要的白色背景。火狐浏览器没问题

    在 Google Chrome 中 单选按钮会在圆圈周围显示不需要的白色背景 这在 Firefox 中并未按预期显示 Please check these images 她是有问题的页面的直接链接 在 Firefox 和 Chrome 中检
  • 是否存在 setfable nthcdr 实现?

    我正在使用 clisp 我想知道是否有任何带有可设置版本的 nthcdr 的库可供我使用 你可以用以下方法解决它 let lst list 1 2 3 4 n 2 setf cdr nthcdr 1 n lst 5 6 7 l gt 1 2
  • 改装 400 错误请求

    这是我用于网络调用的函数 private void getSample Log d getSample OkHttpClient client new OkHttpClient HttpLoggingInterceptor intercep
  • 如何从批处理脚本检查Java安装?

    我需要编写一个批处理脚本来查找是否安装了Java 如果安装了 那么在什么路径下 我觉得它必须是类似这样的 for f j in java exe do set JAVA HOME 但我不明白 附 它必须与带有空格两个的路径一起使用 就像ja
  • Haskell主要函数

    module Main where qsort Ord a gt a gt a qsort qsort x xs qsort smaller x qsort larger where smaller a a lt xs a lt x lar
  • 使用 Android SIP 堆栈进行点对点 SIP 呼叫?

    我一直在寻找一种方法来设置 Android SIP 堆栈 以便能够以临时方式在同一网络上的两个设备之间建立 SIP 呼叫 即无需注册到 SIP 服务器 我无法让它工作 因为 SIP 演示包括服务器注册 如果没有此步骤 我无法让它拨打或接听电
  • python中的全局计数器线程安全吗?

    import threading import time counter 0 def increase name global counter i 0 while i lt 30 this for loop is for consuming
  • 具有固定参数值的路由的别名

    我有这条路线 Route get MyModel id MyController show 方法show 接受一个名为id我想设置一个别名 MyModel 1所以可以从 MyCustomURL 我已经尝试了一些组合 例如 Route get
  • 获取 powershell 显示驱动器上可以找到某个文件的所有路径

    我正在尝试构建一个函数 该函数将显示某个文件名所在的所有路径 该函数将采用一个参数 即文件名 结果要么是所有路径的列表 要么是一条消息说系统上没有这样的文件 我是 Powershell 新手 目前还没有掌握语法 我试过这个 Get Chil
  • 键盘不适用于 uiactionsheet 中的文本字段

    我在 uiactionsheet 中添加了 textfeld 作为 void showAction printf getting action ready n UIActionSheet asheet UIActionSheet alloc
  • Prolog - 递归地将数字附加到列表中

    我刚刚开始学习 Prolog 并且在理解递归概念时遇到了麻烦 现在 仅出于练习目的 我正在尝试编写一个程序 将 10 个数字附加到列表中 然后打印出该列表 这个程序的自我强加的规则是列表必须在主谓词中 声明 我不确定这对于 Prolog 来
  • 我可以使用正则表达式和 pandas 在两个数据帧之间执行左连接/合并吗?

    我正在尝试使用 Python 中的正则表达式执行左合并 该正则表达式可以处理多对多关系 例子 df1 pd DataFrame a b c d columns col1 df1 regex df1 col1 col1 regex 0 a a
  • LinqToSql 查询中的条件快捷方式

    这是一个 LinqToSql 的小陷阱 Returns the number of counties in a state or all counties in the USA if the state is null public sta
  • 向字符串类添加函数

    我知道从 std string 类继承是一个糟糕的主意 但只是尝试使用继承向 string 类添加自定义函数以进行虚拟分配 我想将我的函数称为 add 当我执行 str add str1 str2 时它应该在字符串的开头附加 str1 在字
  • 如何使用 Perl 从文件中获取恰好 n 个随机行?

    跟进this https stackoverflow com questions 448005 whats an easy way to read random line from a file in unix command line问题
  • 我的联系表单的提交按钮未提交和重定向

    我正在开发我的第二个网站 在创建这个网站和我的第一个网站的整个过程中 StackOverflow 上的人们给了我很大的帮助 我可以浏览并找到几乎所有我不想知道的东西 我遇到的 99 的问题 我都用我在这里读到的答案解决了 首先非常感谢大家
  • 计算 R 中一个组中两个值同时出现的次数

    我搜索了这个问题的答案并发现了类似的答案 计算每组内的行数 https stackoverflow com questions 9809166 count number of rows within each group 计算 R 数据帧列