【问题标题】:Assign unique ID if one value is duplicated in at least one of three columns如果一个值在至少三列之一中重复,则分配唯一 ID
【发布时间】:2019-05-08 15:05:26
【问题描述】:

我有一个包含三列的数据框。这些列上有许多缺失值。我想创建一个新的唯一 ID 列,它为每一行提供相同的 id,在三列之一中至少有一个相同的值。

数据框是这样的

df=data.frame(id1=c(5,5,NA,NA,NA,5,4,NA,NA),
              id2=c(NA,58,58,58,NA,58,NA,66,66),
              id3=c(NA,NA,NA,581,581,581,NA,669,NA))
df
  id1 id2 id3
1   5  NA  NA
2   5  58  NA
3  NA  58  NA
4  NA  58 581
5  NA  NA 581
6   5  58 581
7   4  NA  NA
8  NA  66 669
9  NA  66  NA

新列应该是这样的

df=data.frame(id1=c(5,5,NA,NA,NA,5,4,NA,NA),
              id2=c(NA,58,58,58,NA,58,NA,66,66),
              id3=c(NA,NA,NA,581,581,581,NA,669,NA),
              ID=c(1,1,1,1,1,1,2,3,3))
  id1 id2 id3 ID
1   5  NA  NA  1
2   5  58  NA  1
3  NA  58  NA  1
4  NA  58 581  1
5  NA  NA 581  1
6   5  58 581  1
7   4  NA  NA  2
8  NA  66 669  3
9  NA  66  NA  3

【问题讨论】:

  • 如果 id2 的 '58' 在第 9 行,那么它的 id 是什么
  • 在您的示例数据中,这看起来非常简单,每个ID 对应于每个id1id2id3 中的一个值。真的是这样吗?如果有另一行有5 对应id166 对应id2,您是否要将所有ID 3 和1 折叠到一个组中?
  • @akrun:如果第 9 行的 id2 为 '58',则 ID 应为 1。
  • @Gregor:实际上每个 ID 对应于 id1、id2 和 id3 中的单个值。一行的 id1 不可能是 5,而 id2 是 66。

标签: r


【解决方案1】:

鉴于您对@Gregor 问题的回答,这里有一个可以概括的解决方案:

ID1.criteria <- c(5,58,581)
ID2.criteria <- c(4)
ID3.criteria <- c(66,669)
ID <- NULL
for (i in 1:nrow(df)) {
  if (any(df[i,] %in% ID1.criteria)) {
    ID[i] <- 1
  } else {
    if (any(df[i,] %in% ID2.criteria)) {
      ID[i] <- 2
    } else {
      if (any(df[i,] %in% ID3.criteria)) {
        ID[i] <- 3
      } else {
        ID[i] <- NA
      }
    }
  }
}
df$ID <- ID
df
  id1 id2 id3 ID
1   5  NA  NA  1
2   5  58  NA  1
3  NA  58  NA  1
4  NA  58 581  1
5  NA  NA 581  1
6   5  58 581  1
7   4  NA  NA  2
8  NA  66 669  3
9  NA  66  NA  3

如果需要,您可以将条件设​​置为您需要的任何条件,前提是 id1、id2 和 id3 的有限集合对应于相同的 ID 号,与它们进入的顺序无关,并且它们永远不会出现在同一行。

【讨论】:

  • 感谢您提供此解决方案。但是,问题是我的数据框非常大。我有超过 2000 对唯一 ID。因此,我将不得不编写 2000 多行代码来指定每个 IDX.criteria?
  • 对,我相信。根据您对@akrun 的回复,如果具有与ID 1 对应的任何数字的新行被归类为1,例如第9 行或第10 行的58,等等,那么订单和序列变得毫无意义。对ID 进行分类的唯一标准是出现在第 1 列到第 3 列中的特定数字的唯一集合。除非我理解不正确,否则没有系统模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2017-12-18
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
相关资源
最近更新 更多