0

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
4

1 に答える 1

1

dplyrパッケージはこの操作を明確にします。

library(dplyr)
unlist(a_list) %>% table %>% data.frame

  unlist.a_list. Freq
1             I1    6
2             I2    7
3             I3    6
4             I4    2
5             I5    2

アップデート:

何を探しているのか正確にはわかりませんが、組み合わせを取得する方法は次のとおりです。

Cols <- paste0("I",1:3)
p <- length(Cols)
id <- unlist(lapply(1:p, function(i) combn(1:p,i,simplify=F)), recursive=F)
formulas <- sapply(id,function(i) paste(Cols[i],collapse=","))

> formulas
[1] "I1"       "I2"       "I3"       "I1,I2"    "I1,I3"    "I2,I3"    "I1,I2,I3"

更新 2:

これはあなたが必要とすることをするはずです:

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
minsupport = 3
b <- data.frame(a)
c <- b[b$Freq > minsupport,]
d <- combn(c$.,2)
result <- unique(sapply(d,function(i) paste(d[,i],collapse=",")))
> result
[1] "I1,I2" "I1,I3" "I2,I3"

次に、結果のように a_list を折りたたみます。

a.new.list <- sapply(a_list, paste, collapse=",")
> a.new.list
[1] "I1,I2,I5"    "I2,I4"       "I2,I3"       "I1,I2,I4"    "I1,I3"       "I2,I3"       "I1,I3"      
[8] "I1,I2,I3,I5" "I1,I2,I3" 

関数を使用して、matchすべての結果をループします。

hits <- sapply(1:length(result), function(j) match(a.new.list,result[j]))
colnames(hits) <- result
rownames(hits) <- a.new.list
> hits
            I1,I2 I1,I3 I2,I3
I1,I2,I5       NA    NA    NA
I2,I4          NA    NA    NA
I2,I3          NA    NA     1
I1,I2,I4       NA    NA    NA
I1,I3          NA     1    NA
I2,I3          NA    NA     1
I1,I3          NA     1    NA
I1,I2,I3,I5    NA    NA    NA
I1,I2,I3       NA    NA    NA

> apply(hits,2, sum, na.rm=TRUE)
I1,I2 I1,I3 I2,I3 
0     2     2 
于 2015-03-23T03:47:47.027 に答える