Как посчитать уникальные комбинации из таблицы данных в R? - PullRequest
1 голос
/ 03 апреля 2019

У меня есть таблица данных с тремя столбцами.Первые два представляют собой набор точек данных (категориальные данные, которые могут быть либо A, B, либо C).Третий столбец - это объединение двух точек данных, поскольку они принадлежат к набору.Мне нужно получить количество возможных комбинаций и мне нужно считать «A & C» как часть той же группы, что и «C & A», поскольку порядок этих пар не имеет значения.

Ранее,Я установил столбец, который объединял «CAT1 & CAT2», а затем еще один как «CAT2 & CAT1», надеясь подвести итог, но тогда эти цифры, конечно, не складываются должным образом.

library(data.table)
dt1 = data.table(CAT1 = c('a','b','c','b','a','c','c','b','a','c'),
                 CAT2 = c('a','b','c','a','b','c','a','b','c','a'))

dt1[,merged := paste(dt1$CAT1, dt1$CAT2, sep = ' & ')]

counts = data.table(table(dt1$merged))

Выходная таблица "count" дает мне все уникальные значения объединенного столбца, но мне нужно подвести итог, когда точки данных перевернуты ("A & C" + "C & A"),Я понимаю, что это можно сделать вручную, но у меня слишком много фактических точек данных, чтобы сделать их вручную.

Ответы [ 3 ]

1 голос
/ 03 апреля 2019
dt1[,paste(sort(c(CAT1,CAT2)),collapse=" & "),by=1:nrow(dt1)][,table(V1)]
1 голос
/ 03 апреля 2019

Вы также можете сделать что-то вроде этого Примечание. Как уже упоминалось @ chinsoon12, мы можем использовать pmin & pmax

 > setDT(dt1)[,list(Count=.N) ,paste(pmin(CAT1, CAT2), pmax(CAT1, CAT2), sep=' & ')]
   paste Count
1: a & a     1
2: b & b     2
3: c & c     2
4: a & b     2
5: a & c     3
0 голосов
/ 03 апреля 2019

Я плохо разбираюсь в data.table, так что вот мой ответ с data.frame:

Просто отсортируйте две CAT перед вставкой, убедившись, что они всегда в одном и том же порядке.

 dt1$merged<-apply(dt1,1,function(x) paste(sort(x),collapse=" & "))

Я уверен, что есть более быстрый способ использования data.table, но я не уверен, как это сделать.Наивный sort, добавленный в ваш код, выдал ошибку ...

...