手动将交易清单转换为购物篮格式

时间:2018-09-24 07:45:44

标签: r dataframe market-basket-analysis

我要做的是将存储为CSV文件的交易列表编辑为R中“ arules”包可以使用的内容。但是我也想将其保留为数据框,以便导出到另一个CSV文件。所以我从一个简单的数据集开始:

Fruit   Milk    Eggs
yes   yes     no
no    no      yes
no    yes     yes
yes   yes     yes

它应该看起来像这样:

Fruit   Milk    
                Eggs
        Milk    Eggs
Fruit   Milk    Eggs

因此,我读了CSV并获得了列名:

df1 <- read.csv('basket_test.csv')
l <- c()
#create list with item names
for(i in 1:3){
  print(i)
  l <- append(l,names(df1)[i])
  i=i+1
}

这是我遇到问题的地方,R看到分类数据,当我尝试更改它时会抱怨:

#replace "yes" with item name
for(x in 1:3){
  for(y in 1:4){
    if(df1[y,x]=="yes"){
      df1[y,x] <- l[x]
    }
  }
}

它给了我这个错误:

  

无效因子水平,NA产生无效因子水平,NA产生无效因子水平,NA产生无效因子水平,NA产生无效因子水平,NA产生无效因子水平,NA产生无效因子水平,NA产生无效因子水平,NA产生

现在数据框如下所示:

  Fruit Milk Eggs
1  <NA> <NA>   no
2    no  no  <NA>
3   no  <NA> <NA>
4  <NA> <NA> <NA>

我通过重复遍历每个数据帧单元来尝试as.character,然后再次尝试该例程,但这没有用。那么,如何对数据框进行更改以更改其中的值?

谢谢

修改,我确实找到了:

df_fact <- data.frame(lapply(df1,as.factor))
df_trans <- as(df_fact, 'transactions')

来自此处的帖子:R-convert transaction format dataset to basket format for Market Basket Analysis

但是我想自己做,但是这种方法不能产生我可以存储为CSV的内容。

1 个答案:

答案 0 :(得分:1)

您可以将mapplyas.data.frame()结合使用:

df <- read.table(text = "Fruit   Milk    Eggs
yes   yes     no
                 no    no      yes
                 no    yes     yes
                 yes   yes     yes", header = TRUE)

  Fruit Milk Eggs
1   yes  yes   no
2    no   no  yes
3    no  yes  yes
4   yes  yes  yes

df1 <- as.data.frame(mapply(function(x, y){
  ifelse(x == 'yes', y, "")
}, df, names(df)))


  Fruit Milk Eggs
1 Fruit Milk     
2            Eggs
3       Milk Eggs
4 Fruit Milk Eggs

请注意,所有三列都属于factor类,您可能希望将其转换为`as.character。

df1[] <- lapply(df1, as.character)