2012-07-10 2 views
0

J'ai du mal à trouver comment faire cela dans R. J'ai des données comme ça à partir d'un ensemble de ~ 50 fichiers CSV, chaque détaillant un des livres individuels transaction de vente:R: boucle à ajouter à la table de nouvelles colonnes, chacune peuplée avec des données agrégées à partir de différents fichiers CSV

**week 1** 
**author** **title** **customerID** 
author1 title1 1 
author1 title2 2 
author2 title3 3 
author3 title4 3 

**week 2** 
**author** **title** **customerID** 
author1 title1 4 
author3 title4 5 
author4 title5 1 
author5 title6 6 

... ~ 50 weeks, each from a separate csv file 

Je veux obtenir une nouvelle table, chaque ligne représentant un auteur qui apparaît dans l'ensemble de données complet, et avec des colonnes pour chacune des ~ 50 semaines que j'ai données pour. Chaque cellule doit correspondre au nombre de ventes de livres de cet auteur au cours de cette semaine. Cela peut être calculé simplement en additionnant le nombre de lignes avec cet auteur dans le fichier des ventes de cette semaine. Il devrait ressembler à ceci:

**author** **week1** **week2** ... **week50** 
author1 2 1 ... 
author2 1 0 ... 
author3 1 1 ... 
author4 0 1 ... 
author5 0 1 ... 
... 

Toutes les idées? Je sais comment obtenir la liste des auteurs uniques à partir de la première colonne. Et je sais comment charger les données de vente de chaque semaine dans un cadre de données. Mais j'ai besoin d'aide pour automatiser ce processus: 2) effectuer une itération sur les auteurs uniques 2) faire une itération sur le fichier csv de chaque semaine ou sur la trame 3) additionner les ventes de cet auteur pour cette semaine 4) ajouter count comme valeur pour cela cellule

Quelqu'un peut-il aider? Merci :-)

+1

Vous n'avez pas besoin d'une boucle. Mettez toutes les données dans un data.frame avec une colonne supplémentaire 'week' et utilisez' plyr :: ddply' pour agréger. Si vous en avez vraiment besoin, vous pouvez modifier le data.frame par la suite. – Roland

+0

plyr: ddply semble prometteur. mais sûrement une boucle serait une bonne stratégie car j'ai besoin de faire ça pour ~ 50 semaines différentes. –

Répondre

1
text1<-"**week 1** 
**author** **title** **customerID** 
author1 title1 1 
author1 title2 2 
author2 title3 3 
author3 title4 3 
" 

df1<-read.table(header=T,skip=1,stringsAsFactors=F,text=text1) 
week1<-read.table(header=F,nrows=1,stringsAsFactors=F,text=text1,sep=";") 
week1<-substr(week1,3,nchar(week1)-2) 
df1$week<-rep(week1,nrow(df1)) 

text2<-"**week 2** 
**author** **title** **customerID** 
author1 title1 4 
author3 title4 5 
author4 title5 1 
author5 title6 6 
" 

df2<-read.table(header=T,skip=1,stringsAsFactors=F,text=text2) 
week2<-read.table(header=F,nrows=1,stringsAsFactors=F,text=text2,sep=";") 
week2<-substr(week2,3,nchar(week2)-2) 
df2$week<-rep(week2,nrow(df2)) 

df<-rbind(df1,df2) 
names(df)<-c("author","title","customerID","week") 

require(plyr) 
agg<-ddply(df,~author*week,function(df) length(df$title)) 


require(reshape) 
res<-cast(agg,author~week,value="V1",fill=0) 
res 

    author week 1 week 2 
1 author1  2  1 
2 author2  1  0 
3 author3  1  1 
4 author4  0  1 
5 author5  0  1 

Vous ne ont besoin d'une boucle pour lire vos données. Pour cela vous pouvez utiliser quelque chose comme

ff<-list.files(pattern="*.[Cc][Ss][Vv]") 
for (i in 1:length(ff)){ 
    code for reading the data 
    and constructing the data.frame 
} 
+0

Merci beaucoup pour ce Roland! –

+0

Vous êtes les bienvenus. Les gens sauront que la réponse à votre question est satisfaisante. – Roland

+0

Je l'ai presque fonctionné, mais je ne peux pas passer cette erreur en essayant de faire le remodelage (res <-cast (agg, auteur ~ semaine, valeur = "V1", fill = 0) ): "Erreur : La formule de moulage contient des variables non trouvées dans les données en fusion: auteur, semaine ". Et quand je change les noms des colonnes avec des noms (agg) <- c ("author", "week", "count") j'obtiens ceci "Erreur dans data.frame (data [, c (variables), drop = FALSE], résultat = data $ value): arguments impliquent un nombre différent de lignes: 18143, 0 ". Est-ce que j'utilise mal jeter? –

Questions connexes