【问题标题】:Finding group with distinct (non-overlapping) elements查找具有不同(非重叠)元素的组
【发布时间】:2020-04-04 19:01:10
【问题描述】:

我有一个简单的数据框,其中包含组 ID 和每个组的元素,如下所示:

x <- data.frame("ID" = c(1,1,1,2,2,2,3,3,3), "Values" = c(3,5,7,2,4,5,2,4,6))

每个 ID 可能有不同数量的元素。现在我想找到所有具有与其他 ID 不同元素的 ID。在此示例中,将选择 ID1 和 ID3,因为它们具有不同的元素(3、5、7 与 2、4、6)。我还想将这些唯一 ID 及其元素复制到一个新的数据框中,类似于原始数据框。

我将如何在 R 中做到这一点?我的 R 技能非常有限。

非常感谢!

最佳,

【问题讨论】:

  • 欢迎来到 SO。要在此站点上获得帮助,最好以一种便于他人复制和粘贴到 R 中的方式包含您的数据,例如 dput(data)。您还应该包括一个示例,说明您想要的结果是什么样的,因为仅从阅读中判断可能会很棘手。另外,包括您迄今为止尝试过的代码。查看this link 了解更多信息。

标签: r dataframe


【解决方案1】:

对于igraph cliques 来说似乎是一个好问题,一个边缘到另一个 clique,但我似乎无法弄清楚如何使用它。

无论如何,这里有一个选项应用连接来识别具有相同值的 ID,然后使用 data.table 反连接来删除这些 ID:

library(data.table)
DT <- as.data.table(x)
for (i in DT[, unique(ID)]) {
    dupeID <- DT[DT[ID==i], on=.(Values), .(ID=unique(x.ID[x.ID!=i.ID]))]
    DT <- DT[!dupeID , on=.(ID)]
}

输出:

   ID Values
1:  1      3
2:  1      5
3:  1      7
4:  3      2
5:  3      4
6:  3      6

【讨论】:

  • 这行得通。我尝试了一个大型数据集,它给了我具有不同值的 ID。非常感谢!
【解决方案2】:
x <- data.frame("ID" = c(1,1,1,2,2,2,3,3,3), "Values" = c(3,5,7,2,4,5,2,4,6))
gps = split(x, x$ID)
nGroups = length(gps)

k = 1
results = data.frame(ID = NULL, Values = NULL) 

for(i in 1:(nGroups - 1)){
  j = i + 1
  while(j <= nGroups){
    if(length(intersect(gps[[i]]$Values, gps[[j]]$Values)) == 0){
      print(c(i,j))
      results = rbind(results, gps[[i]], gps[[j]]) 
    }
    j = j + 1
  }
}
results
> results
  ID Values
1  1      3
2  1      5
3  1      7
7  3      2
8  3      4
9  3      6

【讨论】:

  • 据我了解,代码遍历每个 ID 并将其值与所有其他 ID 进行比较。但我不确定这是我需要的。例如,结果显示哪些 ID 与 ID1 相比确实不同,但这些 ID 可能具有重叠值。我希望我的评论有意义。
  • 我认为它可以满足您的要求,但是,它不会(就目前而言)检查结果集是否已经包含存储在其中的两个相关 ID 的值。
【解决方案3】:

你可以试试下面的代码,其中y是数据框列表(包括所有独占Value的数据框)

xs <- split(x,x$ID)
id <- names(xs)
y <- list()
ids <- seq_along(xs)
repeat {
  if (length(ids)==0) break;
  y[[length(y)+1]] <- xs[[ids[1]]]
  p <- ids[[1]]
  qs <- p
  for (q in ids[-1]) {
    if (length(intersect(xs[[p]]$Value,xs[[q]]$Value))==0) {
      y[[length(y)]] <- rbind(y[[length(y)]],xs[[q]])
      qs <- c(qs,q)
    }
  }
  ids <- setdiff(ids,qs)
}

示例

x <- data.frame("ID" = c(1,1,1,2,2,2,3,3,3,4,4), 
                "Values" = c(3,5,7,2,4,5,2,4,6,1,3))

> x
   ID Values
1   1      3
2   1      5
3   1      7
4   2      2
5   2      4
6   2      5
7   3      2
8   3      4
9   3      6
10  4      1
11  4      3

你会得到

> y
[[1]]
  ID Values
1  1      3
2  1      5
3  1      7
7  3      2
8  3      4
9  3      6

[[2]]
   ID Values
4   2      2
5   2      4
6   2      5
10  4      1
11  4      3

【讨论】:

  • 非常感谢!类似于我为 James Curran 的回答所写的内容,结果显示哪些 ID 与 ID1 相比确实不同,但这些 ID 可能具有重叠的值。我希望我的评论有意义。
  • @LenLab 您能否显示有关您的评论的预期输出?
  • 嗨,我在网上放了一个文本,我显示了输出。请在此处查看:anotepad.com/notes/xqra9kdk
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多