我要做的是将存储为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的内容。
答案 0 :(得分:1)
您可以将mapply
与as.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)