Нахождение группы с различными (не перекрывающимися) элементами - PullRequest
2 голосов
/ 04 апреля 2020

У меня есть простой фрейм данных с идентификаторами групп и элементами каждой группы, например:

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))

Каждый идентификатор может иметь различное количество элементов. Теперь я хочу найти все идентификаторы, которые имеют отдельные элементы с другими идентификаторами. В этом примере будут выбраны ID1 и ID3, потому что они имеют различные элементы (3,5,7 против 2,4,6). Я также хочу скопировать эти уникальные идентификаторы и их элементы в новый фрейм данных, аналогичный оригиналу.

Как бы я это сделал в R? Мои навыки в области R весьма ограничены.

Большое спасибо!

Bests,

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Похоже, хороший вопрос для igraph клик с одним краем к другому клику, но я не могу понять, как его использовать.

В любом случае, здесь есть вариант применения соединения для идентификации идентификаторов. с теми же значениями, а затем с анти-объединением, чтобы удалить эти идентификаторы, используя data.table:

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)]
}

output:

   ID Values
1:  1      3
2:  1      5
3:  1      7
4:  3      2
5:  3      4
6:  3      6
0 голосов
/ 05 апреля 2020
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
0 голосов
/ 04 апреля 2020

Вы можете попробовать следующий код, где 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...