Преобразование списка транзакций вручную в формат корзины - PullRequest
0 голосов
/ 24 сентября 2018

То, что я пытаюсь сделать, это отредактировать список транзакций, хранящийся в виде CSV-файла, во что-то, что может быть использовано пакетом «arules» в R. Но я также хочу сохранить его как фрейм данных, чтобы я мог его экспортироватьв другой файл 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 в ячейках фрейма данных, перебирая каждую из них, затем повторяя попытку подпрограммы, но это не сработало,Итак, что мне делать с моим фреймом данных, чтобы изменить его значения?

Спасибо

edit Я нашел это:

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

из поста здесь: R-конвертировать набор данных формата транзакции в формат корзины для анализа корзины рынка

Но я пытаюсь сделать это сам, и этот метод ничего не производитЯ могу хранить как CSV.

1 Ответ

0 голосов
/ 24 сентября 2018

Вы можете использовать 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)
...