【发布时间】:2018-06-15 14:03:45
【问题描述】:
我正在处理识别鱼标签 ID 的历史数据集。多年来,一些鱼被多次标记,因此具有与同一个人相关的多个标签 ID(即,一个标签被一个新标签替换)。我想为每条鱼识别所有可能的标签 ID。每条鱼没有唯一的标识符;我只能识别标签 ID 之间的关联。我设法清理了一些数据集并在一列中识别出唯一的标签 ID,并将任何相关的其他标签 ID 添加到同一行的其他列中。但是,列之间存在重复。这是我的数据集的示例:
ID1<-c(101,102,103,105,106,107,108,110,111,112,113,114)
ID2<-c(NA,101,290,309,105,108,NA,220,NA,113,112,112)
ID3<-c(NA,NA,400,106,NA,NA,NA,111,NA,NA,NA,NA)
data<-data.frame(ID1,ID2,ID3)
ID1 ID2 ID3
1 101 NA NA
2 102 101 NA
3 103 290 400
4 105 309 106
5 106 105 NA
6 107 108 NA
7 108 NA NA
8 110 220 111
9 111 NA NA
10 112 113 NA
11 113 112 NA
12 114 112 NA
正如您在此示例中看到的,鱼 1 的标签 ID 为 101 和 102 - 现在,如果您只查看 ID1 列,它们看起来就像两条独立的鱼,但我们知道它是同一条鱼,因为它也具有与标签 102 关联的标签 ID 101。
我生成的数据框应该如下所示:
ID1 ID2 ID3
1 101 102 NA
2 103 290 400
3 105 309 106
4 107 108 NA
5 110 220 111
6 112 113 114
虽然 ID1(第一列)内没有重复的标签 ID,但在 ID1 和 ID2 以及 ID1 和 ID3 之间确实存在重复(ID2 和 ID3 之间不存在重复的标签 ID,NA 除外)。 ID2 中有一些重复项,因为它们与 ID1 中的另一个 ID 相关联(请参阅上面示例中的第 10:12 行,其中标签 ID 112 在 ID1 中显示一次,在 ID2 中显示两次)。
例如,我已经使用 %in% 命令确定了哪些 ID 在列之间重复
data$ID1[data$ID1 %in% data$ID2]
data$ID1[data$ID1 %in% data$ID3]
我已将其构建到 ifelse 语句中:
ifelse(data$ID1 %in% data$ID2| data$ID1 %in% data$ID3, "Match", "Nomatch")
但这只会告诉我哪些 ID 是重复的,我不知道如何将信息实际组合到一行中。
我还尝试将这些数据分成两个不同的数据框,以便我可以使用连接命令,但我丢失了相关信息。
我在想我可能需要使用 aggregate() 或 combine() 并将其包装到我的 ifelse 语句中?或者也许有办法在 dplyr 中做到这一点?任何帮助将不胜感激!
【问题讨论】:
-
很难,以后得考虑考虑。
-
当我尝试将数据转换回“现实”场景时,这没有多大意义。第 10 行和第 11 行的数据是如何产生的?请不要使用
as.data.frame(cbind(...))。只需使用data,frame,您将避免与混合矩阵和数据框类相关的错误。 -
这是一个庞大的历史数据集,我最好的猜测是输入数据的人没有考虑到标签 ID 的输入顺序很重要。但我确实在文件中有这样的实例。
-
我不清楚您是如何决定构建数据框的。您说过:“ID1 和 ID2 以及 ID1 和 ID3 之间确实存在重复项(ID2 和 ID3 之间不存在重复项,NA 除外)”。根据您的数据示例,同一条鱼最多有三个 ID。整个数据集都是真的吗?不管是不是真的,我对你的问题有一个不优雅的解决方案。
标签: r duplicates dplyr aggregate