В настоящее время у меня есть таблица, настроенная в формате корзины, так что с каждой строкой таблицы связано нерегулярное количество данных. Такие как:
01,item1,item2,item3
02,item1,item2,
03,item1,item2,item3,item4
04,item1
Тем не менее, мне нужно изменить его на нормализованный транзакционный формат, содержащий только один элемент в каждой строке. Такие как:
01,item1
01,item2
01,item3
02,item1
02,item2
03,item1
...и так далее. Есть ли простой автоматический или программный способ сделать это? Данные в настоящее время находятся в базе данных MySQL, которые я могу экспортировать в различные типы файлов, и у меня также есть доступ к RStudio и Microsoft Excel, чтобы попытаться это сделать. Все транзакционные ресурсы, которые я мог найти для RStudio, предполагают, что данные уже были во втором формате, к чему я пытаюсь добраться.
Я предполагаю, что понимаю, как ваш набор данных будет выглядеть, как только вы его прочитаете в R, т.е. Это будет прямоугольный фрейм данных, где NA заполняется, чтобы строки были одинаковой длины. Поэтому это должно решить проблему:
#Create your dataset (this step is not for you)
row1 = c("01","item1","item2","item3",NA)
row2 = c("02","item1","item2",NA,NA)
row3 = c("03","item1","item2","item3","item4")
row4 = c("04","item1",NA,NA,NA)
Data = rbind(row1,row2,row3,row4)
#Now do the reconstruction (this step is for you)
col1 = NULL
col2 = NULL
for(i in 1:nrow(Data)){
col1 = c(col1,rep(Data[i],ncol(Data)-1))
col2 = c(col2,Data[i,-1])
}
NewData = cbind(col1,col2)[!is.na(col2),]
Итак, вы получаете следующее
> Data
[,1] [,2] [,3] [,4] [,5]
row1 "01" "item1" "item2" "item3" NA
row2 "02" "item1" "item2" NA NA
row3 "03" "item1" "item2" "item3" "item4"
row4 "04" "item1" NA NA NA
>
> NewData
col1 col2
[1,] "01" "item1"
[2,] "01" "item2"
[3,] "01" "item3"
[4,] "02" "item1"
[5,] "02" "item2"
[6,] "03" "item1"
[7,] "03" "item2"
[8,] "03" "item3"
[9,] "03" "item4"
[10,] "04" "item1"
Так надеюсь, что это помогает.
Этот вопрос очень похож на этот один. Поскольку @DWin упоминает в своем комментарии, вам нужно применить paste(.,. sep=",")
к расщепленному списку.
xx <- read.table(text ='01,item1,item2,item3
02,item1,item2,
03,item1,item2,item3,item4
04,item1')
unlist(lapply(strsplit(as.character(xx$V1), ','),
function(x) paste(x[1],x[-1],sep=',')))
[1] "01,item1" "01,item2" "01,item3" "02,item1" "02,item2" "03,item1" "03,item2" "03,item3" "03,item4" "04,item1"