Обновлены фиктивные данные и фиктивный код - извинения, я предположил, что мой вопрос прост, и вы могли бы посоветовать лучший способ без воспроизводимого примера.
dummy<-data.frame(prodA=c(0,0,0,1,1,0,0,1),
prodB=c(0,0,1,1,0,1,1,0),
prodC=c(1,1,1,0,0,0,0,1))
dummy[,4:6]<-dummy[,1:3]
for (j in (1:nrow(dummy))){
for (i in 4:6){
dummy[j,i]<-ifelse(dummy[j,i]==1,colnames(dummy[i]),"")}
}
dummy2<-dummy[,4:6]
dummy$NewProds<-apply(dummy2,1,paste,collapse="")
dummy$NewProds<-gsub(".1","//",dummy$NewProds)
Моя вторая попытка выглядит так:
prods<-dummy[,1:3]
prods[,4:6]<-dummy[,1:3]
for (i in 4:6){
prods[,i]<-colnames(prods[i-3])
}
prods[,7:9]<-prods[,4:6]
#works, but I will need multiple ifs for this to work, suggesting this
#won't be very efficient
prods[,10]<-ifelse(prods[,1]==1,prods[,4],"")
Исходное сообщение следует: Я играю с набором рекомендаций по продуктам Сантандера от Kaggle.Я определил, какие продукты были приобретены от одного месяца к другому.Это означает, что у меня есть 23 столбца 1 (когда добавлен новый продукт) и 0 (когда нет).Я создал следующий код, чтобы вернуть имя столбца при покупке продукта.Он отлично работает на выборке из 6 строк, но он работает вечно, когда я пробую это на 48 000 клиентов, которые изменились, не говоря уже о миллионе в наборе данных.
Есть ли другой способ сделать это?
df2[,99:122]<-df2[,72:95]
for (j in (1:nrow(df2))){
for (i in 99:122){
df2[j,i]<-ifelse(df2[j,i]==1,colnames(df2[i]),"")}
}
df22<-df2[,99:122]
df2$NewProds<-apply(df22,1,paste,collapse="")
df2$NewProds<-gsub("change.1","//",df2$NewProds)
Я подумал, что проблема в том, что я смотрю на каждую переменную и поэтому начал с другого подхода, согласно которому я бы взял пару версий данных, а затем сделал бы переменную if равной 1, а затем взял бы имя.Однако я не мог заставить это работать, и я думаю, что я прихожу к той же самой проблеме.
#copy a bunch of 1's and 0's
prods<-df2[,72:95]
#repeat and overwrite with colnames
prods[,25:48]<-df2[,72:95]
for (i in 25:48){
prods[,i]<-colnames(prods[i-24])
}
prods[,49:72]<-prods[,25:48]
#attempt to only populate colnames if it was originally a 1 - doesn't work
prod[,49]<-ifelse(prod[,1]==1,prod[,25],"")
Я не предоставил никаких данных, но я надеюсь, что вы видите то, что я пытаюсь сделать и могупосоветуйте эффективные способы сделать это.Заранее спасибо, J