2016-07-19 3 views
-1

У меня есть dataframe, как показано ниже.Идентификация частоты элементов в списке

11,15,12,25 
11,12 
15,25 
134,45,56 
46 
45,56 
15,12 
66,45,56,24,14,11,25,12,134 

Я хочу идентифицировать частоту пар/триплетов или выше, которая встречается в данных. Скажем, например, в приведенных выше данных возникновение пар выглядит, как показано ниже

item  No of occurrence 
11,12  3 
11,25  2 
15,12  2 
15,25  2 
. 
. 
45,56  3 
134,45,56 2 ....and so on 

Я пытаюсь написать код для R выше, и я нахожу трудности подойти к этому.

+0

Пожалуйста, не помечать Q со всеми тегами, для которых вы хотели бы ответ с. – Arun

+0

Возможно иметь head() блока данных и str() – CClaire

+0

Это не действительная структура фрейма данных. – mkt

ответ

1

Учитывая 1 столбец data.frame с запятой, разделяющей переменными, следующим должен давать желаемый результат:

# split column into a list 
myList <- strsplit(df$V1, split=",") 
# get all pairwise combinations 
myCombos <- t(combn(unique(unlist(myList)), 2)) 

# count the instances where the pair is present 
myCounts <- sapply(1:nrow(myCombos), FUN=function(i) { 
        sum(sapply(myList, function(j) { 
           sum(!is.na(match(c(myCombos[i,]), j)))})==2)}) 

# construct final matrix 
allDone <- cbind(matrix(as.integer(myCombos), nrow(myCombos)), myCounts) 

Это возвращает матрицу, где первые два столбца элементы в сравнении и в третьей колонке подсчета, что эти элементы находятся в строке data.frame.

данные

df <- read.table(text="11,15,12,25 
11,12 
15,25 
134,45,56 
46 
45,56 
15,12 
66,45,56,24,14,11,25,12,134", as.is=TRUE) 
+0

@Imo Это сделало магию. Огромное спасибо. И еще одно: можно ли проверить все комбинации, а не только пары. Скажем, например, создание всех возможных комбинаций и подсчет частоты для конкретной комбинации в кадре данных. – ssan

+1

Это возможно, хотя и немного утомительно для кодирования: вам нужно добавить дополнительный цикл, где myCombos изменяется, и вы настраиваете второй аргумент 'combn (, k)'. В этом новом цикле k будет скорректирован с 2 на некоторое большее целое число. – lmo