2013-08-21 2 views
0

Как я могу использовать таблицу()? В таблице записи у меня есть:Использование таблицы() для подсчета частоты факторов r

USER DATE ITEM 
A 1 alpha 
A 1 beta 
A 1 gamma 
A 2 alpha 
A 2 gamma 
A 4 beta 
A 4 gamma 
B 1 alpha 
B 1 beta 
... 

Если USER получил еще один элемент с ITEM «альфа» в тот же день, что был другой ITEM и какие из этих элементов присутствовали больше всего?

Информационный кадр, который мне нужно использовать для этого, действительно огромный, имея более 2 миллионов записей (ну, по крайней мере, для меня это огромный ^^). Я использовал таблицу() несколько раз, но до сих пор не мог понять, как использовать ее для моих нужд.

UPDATE: Вывод должен быть таким:

amount_of_users combination 
2 (alpha,beta) 
1 (alpha,gamma) 
1 (beta,gamma) 
1 (alpha, beta, gamma) 

Я обновил главную таблицу, чтобы показать, что главная проблема состоит в следующем: Если пользователь имеет пункт альфа, любой 2-, 3 - подсчитан 4-элементный комбинат, он должен появиться, поскольку он явно получил предмет с другими предметами - но все же в тот же день.

ОБНОВЛЕНИЕ: Как правильно указано DWin, было неясно, чего я пытаюсь достичь. Пусть у одного пользователя есть предметы: альфа, бета, гамма. Затем этот пользователь должен быть добавлен к каждому счету любого его подмножества, то есть комбинации (альфа, бета) (бета, гамма) (альфа, гамма) и, наконец, (альфа, бета, гамма), все получат счет + 1.

В то же время я думал, что для моей главной цели (я хочу видеть, какие самые видные ITEMS, добавляемые к определенному ITEM, например, альфа), я мог бы просто подсчитать количество пользователей, используя таблицу и colSums , пожалуйста, найдите мое очень плохое решение, но указав элементы, добавив больше всего.

levels(x$TARGETGROUP)[c(8,15:17,39,41,57,58,61)] <- c("HOME") 
levels(x$TARGETGROUP) 
dings <- table(x[,1],x[,3]) 
str(dings) 
#i saw, that the 8th column contains item I needed. 
haeuf <- colSums(dings[dings[,8]!=0, ]) 

Опять же, это решение явно очень грязно, но я все еще в очень ранней стадии обучения R и не нужно (пока) номер, который действительно говорит мне количество пользователей, но вместо этого просто говорит мне какую-то тенденцию.

+0

Пожалуйста, разместите пример вывода, который вы ожидаете на основе этого ввода. – A5C1D2H2I1M1N2O1R2T1

+3

Позвольте мне перефразировать: для 7 строк данных, которые вы предоставили, каков будет ожидаемый результат? – A5C1D2H2I1M1N2O1R2T1

+0

Извините, вы были правы, все еще были зафиксированы в датах. – Mustafa

ответ

0

Это что нужно?

aggregate(dd$ITEM, 
      by= dd[, c('USER','DATE')], 
      FUN=function(x) list(as.character(x))) 

    USER DATE     x 
1 A 1 alpha, beta, gamma 
2 B 1  alpha, beta 
3 A 2  alpha, gamma 
4 A 4  beta, gamma 

(. Последний пункт не имеет смысла для меня)

+0

Я думаю, что OP также хочет, чтобы все подмножества элементов, когда имеется более двух элементов для пары, связанной с датой. Поэтому пользователю A в дате 1 также нужна строка «alpha, beta» и «beta, gamma». – Marius

+0

@ Мариус прав. Но это только базовая таблица ввода. После этого я хочу получить количество комбинаций, содержащих одно конкретное значение + сама комбинация, как указано в моем первом сообщении. – Mustafa

+0

Я бы не согласился с тем, что это было либо указано, либо приведено в качестве примера в сообщении. Итак, если у USER была 'alpha.beta.gamma' в один день, то это должно считаться одним из всех категорий« alpha.beta »,« alpha.gamma »и« beta.gamma »? Вы хотите, чтобы набор и все соответствующие подмножества больше длины 1 подсчитывались? –

0

Я думаю lala88 хочет также частоты, одно решение может быть:

require("combinat") 

m<-max(sapply(split(dd, f=dd$USER), function(x) length(unique(x[, "ITEM"])))) 

fun<-function(i, dd){ 
    ind <- sapply(split(dd, f=dd$USER), function(x) length(unique(x[, "ITEM"]))>=i) 
    res <- lapply(split(dd, f=dd$USER)[ind], 
       function(x) combn(unique(x$ITEM), i, 
            simplify = FALSE, 
            fun=paste, collapse=" ")) 
table(unlist(res)) 
} 


lapply(2:m, fun, dd=dd) 

Существует еще комната для улучшения моего кода ... поэтому не стесняйтесь редактировать ...

+0

Большое спасибо за вашу идею - единственная проблема в том, что я действительно не знаю, как долго может быть самая длинная комбинация различных строк. :) – Mustafa

+0

... просто для того, чтобы обеспечить полное решение :) – holzben

1

Также можно использовать пакет arules.

# Data 
d0<- read.delim(textConnection("USER DATE ITEM 
A 1 alpha 
A 1 beta 
A 1 gamma 
A 2 alpha 
A 2 gamma 
A 4 beta 
A 4 gamma 
B 1 alpha 
B 1 beta"), sep=" ") 

# Reshape the data and compute all the itemsets 
library(arules) 
library(reshape2) 
d <- dcast(USER ~ ITEM, data = d0)[,-1] > 0 
r <- apriori(d, par = list(target="frequent itemsets", support = 0, minlen=2)) 

# Display the results 
inspect(r) 
as(r, "data.frame") 
within(as(r, "data.frame"), { count = support * nrow(d) }) 
#    items support count 
# 1  {beta,gamma}  0.5  1 
# 2  {alpha,gamma}  0.5  1 
# 3  {alpha,beta}  1.0  2 
# 4 {alpha,beta,gamma}  0.5  1 

Это не относится к данной дате. Если вы хотите разделить набор предметов по дате, а также пользователей:

d <- dcast(USER + DATE ~ ITEM, data = d0, fun.aggregate=length)[,-(1:2)] > 0 
r <- apriori(d, par = list(target="frequent itemsets", support = 0, minlen=2)) 
within(as(r, "data.frame"), { count = support * nrow(d) }) 
#    items support count 
# 1  {alpha,beta} 0.50  2 
# 2  {alpha,gamma} 0.50  2 
# 3  {beta,gamma} 0.50  2 
# 4 {alpha,beta,gamma} 0.25  1 
Смежные вопросы