加速R中的代码执行,以提供属于特定ID的所有可能事件组合的计数

加速R中的代码执行,以提供属于特定ID的所有可能事件组合的计数,r,counting,data-wrangling,R,Counting,Data Wrangling,我有一个数据集,有3列,(ID,D,AE) 我想计算ID的数量,其中所有可能的组合包括特定ID内任意两种药物之间的任何组合以及对应于该ID的AEs。请查看图片以准确理解我的意思 有人可以帮我编写一个在小数据集(示例)上完美运行的代码。但是,代码在实际数据集(46000个唯一ID、1600个唯一D值和3200个唯一AE值)上工作需要几个小时。实际上,我不得不在3小时后(代码执行时)中断会话,而没有得到任何输出 下面是我希望改进其性能以适应庞大数据集的代码: enter code here 库(t

我有一个数据集,有3列,(ID,D,AE)

我想计算ID的数量,其中所有可能的组合包括特定ID内任意两种药物之间的任何组合以及对应于该ID的AEs。请查看图片以准确理解我的意思

有人可以帮我编写一个在小数据集(示例)上完美运行的代码。但是,代码在实际数据集(46000个唯一ID、1600个唯一D值和3200个唯一AE值)上工作需要几个小时。实际上,我不得不在3小时后(代码执行时)中断会话,而没有得到任何输出

下面是我希望改进其性能以适应庞大数据集的代码:

enter code here
库(tidyverse)
组合%
突变(D2=D)%>%
分组依据(ID)%>%
展开(交叉(D,D2,AE))%>%#获取ID中的所有D1,D2,AE组合
过滤器(D2>D)%>%#重复数据消除到唯一的组合
重命名(D1=D)%>%
解组()%>%
不同的(D1、D2、AE)#跨ID进行重复数据消除
​
#对于给定的D1、D2、AE组合;检查样本中有多少ID具有该组合
计数%
分组依据(ID)%>%
变异(
has_D1=if_else(D1值%D,“D1”,“无D1”),
has_D2=if_else(D2值%D,“D2”,“无D2”),
has_AE=if_else(AE_val%在%AE中,“AE”,“no AE”)
) %>% 
组别(组别D1、组别D2、组别AE)%>%
总结(n_ID=n_distinct(ID),.groups=“drop”)%>%
列表(.)
}
​
组合%>%
突变(数据=列表(样本))%>%
行()
mutate(data=count_ID(D1、D2、AE、data))%>%#获取每个组合的ID计数
unnest(数据)%%>%
mutate(colname=str_c(has_D1,has_D2,has_AE,sep=“,”)%%>%#为每种可能的组合创建一个列名
选择(-start_with(“has”))%>%
轴更宽(名称从=colname,值从=n\u id,值填充=0L)#展开为宽格式

我非常感谢你的帮助。提前谢谢

我无法运行示例。有丢失的包裹吗?我已经添加了
library(tidyr)
library(dplyr)
,但是在UseMethod(“groupby”)中得到了消息
Error:没有适用于“groupby”的方法应用于最终line@JonnyPhelps我也是这样,但我重新启动了R会话,加载了
tidyverse
并且示例成功了是的,很抱歉,我忘了添加库(tidyverse),我将编辑帖子。该代码在小型数据集上运行良好。主要问题出现在我尝试使用大型数据集时,代码的最后一部分需要数小时才能执行,我最终放弃并停止了操作…@HossamMohamed
tidyverse
(因为使用了太多的
%>%
管道)的特点不是特别快。这似乎是一个需要通过库
data.table
来解决的问题,但我对它了解得不够,无法帮助您是的,我也这么认为。但不幸的是,我不知道如何在这种情况下使用data.table:(我无法运行示例。是否缺少包?我已经添加了
library(tidyr)
&
library(dplyr)
,但得到消息
Error-in-use-method(“group\U by”):没有适用于“list”类对象的“group\U by”方法
在决赛中line@JonnyPhelps我也遇到了同样的情况,但我重新启动了R会话,加载了
tidyverse
,示例成功了是的,很抱歉,我忘了添加库(tidyverse),我将编辑帖子。该代码在小数据集上运行得非常好。主要问题发生在我尝试使用大数据集时,代码的最后一部分需要几个小时才能执行,我最终放弃并停止了操作…@HossamMohamed
tidyverse
(因为使用了太多的
%>%
管道)其特点不是特别快。这似乎是一个需要通过库
data.table
解决的问题,但我对它了解得不够,无法帮助您是的,我也这么认为。但不幸的是,我不知道如何在这种情况下使用data.table:(
enter code here
library(tidyverse)

combinations <- sample %>%
  mutate(D2 = D) %>%
  group_by(ID) %>%
  expand(crossing(D, D2, AE)) %>% # Get all D1, D2, AE combinations within-ID
  filter(D2 > D) %>% # Deduplicate to unique combinations
  rename(D1 = D) %>%
  ungroup() %>%
  distinct(D1, D2, AE) # Deduplicate across IDs
​
# For a given combination of D1, D2, AE; check how many IDs in sample have that combination
count_ids <- function(D1_val, D2_val, AE_val, data) {
  data %>%
    group_by(ID) %>%
    mutate(
      has_D1 = if_else(D1_val %in% D, "D1", "no D1"),
      has_D2 = if_else(D2_val %in% D, "D2", "no D2"),
      has_AE = if_else(AE_val %in% AE, "AE", "no AE")
    ) %>% 
    group_by(has_D1, has_D2, has_AE) %>%
    summarise(n_IDs = n_distinct(ID), .groups = "drop") %>%
    list(.)
}
​
combinations %>%
  mutate(data = list(sample)) %>%
  rowwise() %>%
  mutate(data = count_ids(D1, D2, AE, data)) %>% # Get the ID counts for each combination
  unnest(data) %>%
  mutate(colname = str_c(has_D1, has_D2, has_AE, sep = ",")) %>% # Create a column name for each possibility of the combinations
  select(-starts_with("has_")) %>%
  pivot_wider(names_from = colname, values_from = n_IDs, values_fill = 0L) # Spread out to wide format