У меня есть датафрейм в формате корзины, такой как:
V1 <- c('milk', 'beer', 'wrench', 'milk' )
V2 <- c('eggs', 'elbow grease', '', 'beer')
V3 <- c('water', '', '', '')
df <- data.frame(V1, V2, V3)
выход:
V1 V2 V3
1 milk eggs water
2 beer elbow grease
3 wrench
4 milk beer
Я хотел бы создать кадр данных в одном формате, подобном следующему:
transaction product
1 1 milk
2 1 eggs
3 1 water
4 2 beer
5 2 elbow grease
6 3 wrench
7 4 milk
8 4 beer
Пока что мне нужны данные в кадре данных, чтобы я мог фильтровать их перед тем, как переключиться на формат транзакций, который использует пакет apriori R.
Какой самый быстрый способ преобразовать этот фрейм данных из корзины в единый формат?
Сейчас я использую очень медленный цикл.
dfSingle <- data.frame(product = character(),
transaction = integer())
for (row in 1:nrow(df)) {
# Create a list of products
productList <- unname(unlist(df[row, ]))
# Remove blank spaces
productList <- productList[!productList %in% ""]
# Convert to a dataframe
dfTemp <- as.data.frame(productList)
colnames(dfTemp) <- "product"
dfTemp$transaction <- row
# Bind to larger dataframe with previous rows
dfSingle <- rbind(dfSingle, dfTemp)
}
Я думал об использовании apply
для применения этой функции к каждой строке, но я не уверен, как связать несколько результирующих строк с результатами предыдущих строк.