【发布时间】:2022-08-04 22:31:56
【问题描述】:
我有两个数据框,DF1,DF2,每个都有两列(a,b)。一列 (a) 是唯一标识符,另一列是 (b) 列,其中包含包含列表的元素。该列表包含标签名称。我想搜索 DF2$b 元素以查看它们是否包含在 DF1$b 中,如果是,我想创建一个新列 DF2$c,它采用 DF1a 中的标识符。棘手的部分是,如果唯一标识符是数据框中存在的最小联合,我只想采用唯一标识符。作为一些背景,这些数据来自系统发育树。 DF2 是 DF1 的子样本。 DF2 中的所有提示都包含在 DF1 中。我想将 DF2 的节点与 DF1 的节点进行比较(节点名称不同),但我可以从每个节点的后代的提示中识别节点。
如果我用一个例子来解释会更容易:
df1 <- data.frame(a = c(1486, 1485, 1484, 1483, 1482, 1481, 1480, 1479))
df1$b = list(c(\"KC792204\", \"KF150733\", \"KC792205\"), c(\"KC792204\", \"KF150733\", \"KC792205\", \"JX987740\", \"KX148108\", \"JX987724\"), c(\"KC792204\", \"KF150733\", \"KC792205\", \"KC791848\"), c(\"KJ201900\", \"KJ201899\", \"KF535207\"), c(\"KJ201900\", \"KJ201899\", \"KF535207\", \"AB817119\", \"AB817100\"), c(\"GU731662\", \"GU731661\", \"KP319229\", \"KY428876\"), c(\"GU731662\", \"GU731661\", \"MT826960\"), c(\"GU731662\", \"GU731661\", \"MT826960\", \"AM689535\", \"GU731663\"))
df2 <- data.frame(a = c(8645, 1247, 5879, 1548, 2487, 1245, 1247, 3695))
df2$b = list(c(\"KC792204\", \"KF150733\"), c(\"KC792204\", \"KC792205\", \"KC791848\"), c(\"KJ201900\", \"KF535207\"), c(\"KC792204\", \"JX987740\", \"KX148108\", \"JX987724\"), c(\"GU731662\", \"GU731661\", \"MT826960\", \"GU731663\"), c(\"KJ201900\", \"KJ201899\", \"AB817119\", \"AB817100\"), c(\"GU731661\", \"KP319229\", \"KY428876\"), c(\"GU731662\", \"MT826960\"))
我想在 df2 中创建一个新列 df2$c,它标识 df1 中包含 df2$b 的最小列表(或节点)。这个新列由 df1$a(唯一标识符)创建。在示例中, df2$c (按顺序)
c(\"1486,1484,1483,1485,1479,1482,1481,1480\")
以前两个为例:
df2$a is c(\"KC792204\", \"KF150733\")
这个可以在df1$b[1], df1$b[2], df1$b[3], or 1486, 1485, or 1484.找到,因为我在找最小长度的列表,所以结果是1486。1486是最小长度的列表,包含了所有被搜索的标签。 df2$b is c(\"KC792204\", \"KF150733\", \"KC791848\") 中的下一个列表。这个结果是 1484,因为只有 df$1b 中的列表 1484 包含这三个标签。
我努力了:
df2$c <- ifelse(df2$b %in% df1$b, df1$a, \'other\')
但我将列表作为一个整体而不是每个列表中的元素进行比较。我还需要找到包含搜索标签的最小列表。
标签: r if-statement dplyr phylogeny ape