【问题标题】:R: find most frequent combinations within same idR:在同一 id 中查找最常见的组合
【发布时间】:2016-11-01 10:51:44
【问题描述】:

我在计算药物组合的数量时遇到了问题。我的数据组织在两个数据框中。 df1 包含 id 和 found 的药物,例如:

ID | drug
-----------
1  | drug1
1  | drug2
1  | drug3
2  | drug3
2  | drug5
3  | drug1
3  | drug3
3  | drug4
3  | drug5

df2 显示了 2 种不同药物的所有可能药物组合,如下所示:

combi1 | combi2
-----------------
drug1  | drug2
drug1  | drug3
drug1  | drug4
drug2  | drug3
drug2  | drug4
drug2  | drug5

总共有 7140 种可能的组合。我想要的是找出有多少个ID组合drug1-drug2drug1-drug3等等。

我一直在尝试双 for 循环:

counter=0
for(com in 1:nrow(df2)){
 for(id in 1:unique(df1$ID)){
   if(df2$combi1[com] %in% df1$drug[id] & df2$combi2[com] %in% df1$drug[id])   {
  counter=counter+1
  }
}
df2$count=counter
counter=0
}

但它不起作用,因为它一次只能检查一行。我也尝试过Find Most Frequent Combination within a Vector by Group 中的解决方案,但没有任何运气。

此外,我需要对三种药物的组合做同样的事情

编辑: 我喜欢 df2 中的输出是这样的,在那里我可以看到 drug1 和 drug2 在 ID 中作为组合出现了多少次。例如,只有一个 ID 同时具有 drug1 和 drug2,而 2 个 ID 具有 drug1 和 drug3

combi1 | combi2 | count
-----------------------
drug1  | drug2  |   1
drug1  | drug3  |   2
drug1  | drug4  |   0
drug2  | drug3  |   1
drug2  | drug4  |   0
drug2  | drug5  |   0

【问题讨论】:

标签: r combinations


【解决方案1】:

对于这个,我访问了 data.table,但您也可以轻松地使用 tidyr

library(data.table)
set.seed(213) # set seed
d <- data.table(ID = rep(1:3, each = 3), drug = paste0("drug", sample(1:5, 9, rep = T))) 

get_combs <- function(x, n = 2){
  uniq_x <- sort(unique(x))
  if(length(uniq_x) < n){
    return(NULL)
  } else {
    return(as.data.frame(t(combn(uniq_x, n)), stringsAsFactors = FALSE))
  }

}

combi <- d[, get_combs(drug), by = ID][order(V1, V2),]
combi[ , .N, by = .(V1, V2)]

      V1    V2 N
1: drug1 drug2 2
2: drug1 drug4 2
3: drug2 drug4 2
4: drug3 drug5 1

【讨论】:

  • 这并不是真正的药物组合。
  • 对不起,你是对的 - 我误解了你的问题。我再试一次。
  • 第二个输出有助于澄清问题,谢谢。
  • 这很奇怪。当我将您的代码从上面的虚拟集更改为真实数据时,它声称Error in [.data.frame(mydata, ,get_combs(drug), by = ID) : unused argument (by = ID)
  • @reuss:确保mydatadata.table(这是一个增强的data.frame)。例如使用setDT(mydata)
【解决方案2】:

重塑数据可能更容易:

library(reshape2)
set.seed(213) # set seed
df <- data.frame(ID = rep(1:3, each = 3), drug = paste0("drug", sample(1:5, 9, rep = T))) #define data
df <- dcast(df, ID ~ drug)
df
  ID drug1 drug2 drug3 drug4 drug5
1  1     1     1     0     1     0
2  2     0     0     2     0     1
3  3     1     1     0     1     0

现在每个 ID 都有一行中的组合,您可以使用标准子集来查找具有特定组合的所有 ID。这是你想要的?如果没有,请将所需的输出添加到您的问题中。

【讨论】:

  • 不,不是。我想知道有很多 ID 同时具有 drug1 和 drug2。编辑:在我写完这篇文章之后,你只是在答案中添加了更多内容
  • 我在底部的问题中添加了所需输出的编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多