Rコードでアプリオリアルゴリズムを書こうとしています。まず、リスト内の各項目の頻度を数えたいと思います。私は以下のような初期コードを持っています:
a_list <- list(c("I1","I2","I5"),
c("I2","I4"),
c("I2","I3"),
c("I1","I2","I4"),
c("I1","I3"),
c("I2","I3"),
c("I1","I3"),
c("I1","I2","I3","I5"),
c("I1","I2","I3"))
sapply(a_list, function(x) length(x))
un <- unique(unlist(a_list))
nm <- lapply(un, function(x) sapply(a_list, function(y) sum(y == x)))
names(nm) <- un
nm
私は次のような結果を持っています:
> nm
$I1
[1] 1 0 0 1 1 0 1 1 1
$I2
[1] 1 1 1 1 0 1 0 1 1
$I5
[1] 1 0 0 0 0 0 0 1 0
$I4
[1] 0 1 0 1 0 0 0 0 0
$I3
[1] 0 0 1 0 1 1 1 1 1
ただし、次のように配置したいです(おそらく、マトリックスまたは配列に再リストしてから、さらに操作できます):
> nm
I1 6
I2 7
I3 6
I4 2
I5 2
各項目には頻度カウントがアルファベット順に表示されます。それを実装する方法はありますか?cbind、apply、relist を試しましたが、まだ解決策が見つかりません。ありがとう
アップデート:
library(dplyr)
a_list <- list(c("I1","I2","I5"),
c("I2","I4"),
c("I2","I3"),
c("I1","I2","I4"),
c("I1","I3"),
c("I2","I3"),
c("I1","I3"),
c("I1","I2","I3","I5"),
c("I1","I2","I3"))
a <- unlist(a_list) %>% table %>% data.frame
a
minsupport = 3
b <- data.frame(a)
c <- b[b$Freq > minsupport,]
c
今、私は次のような結果を得ました:
> a
. Freq
1 I1 6
2 I2 7
3 I3 6
4 I4 2
5 I5 2
> c
. Freq
1 I1 6
2 I2 7
3 I3 6
元のリストをスキャンして、「I1、I2」、...、「I2、I3」の組み合わせを設定するにはどうすればよいですか?
UpDATE: 以下のようにcombnを試したところ、行列が出力されました。
> combn(c$.,2)
[,1] [,2] [,3]
[1,] I1 I1 I2
[2,] I2 I3 I3
Levels: I1 I2 I3 I4 I5
さらに次のように変更されます。
d <- combn(c$.,2)
result <- unique(sapply(d,function(i) paste(d[,i],collapse=",")))
result
私の結果は次のとおりです。
> result
[1] "I1,I2" "I1,I3" "I2,I3"
次に、元の「a_list」から上記のアイテムセットの頻度を数えます。として出力した方が良いかもしれません。
""I1","I2"", ""I1","I3"", ""I2","I3""
元のリストと比較するため。
元のa_listからこのマトリックスのアイテムセットの頻度を取得するにはどうすればよいですか? apriori アルゴリズムでは、1 次元 (a_list の「I1」、「I2」、...、「I5」) から 2 次元 (「I1,I2」「I1」) まで、最小サポート以上のすべての項目セットをスキャンする必要があります。 ,I3" この場合は "I2,I3")、該当する場合は on (例: "I1,I2,I3")。
更新: これで、("I1","I2") または ("I1","I3") などの特定のパターンとの一致を個別に見つけることができます。
toMatch <- c("I1","I2")
matches <- grepRaw(toMatch,a_list,ignore.case = TRUE)
matches
結果:
> matches
[1] 4
「結果」のすべてのパターンを一度に一致させるにはまだ問題が残っています (上記の例ではパターンを手動で入力しましたが、「結果」から抽出する必要があります)。そして、それらを次の形式で出力します。
Itemset Freq
""I1","I2"" 4
""I1","I3"" 4
""I2","I3"" 4