2017-03-22 4 views
1

J'essaie de croiser des tables à partir d'une liste de données générées à partir de données brutes. La base de données originale comprend 1004 observations de 8 variables.Colnames et noms de code ne sont plus disponibles après le stockage des trames de données dans une liste

> summary(mydata) 
ARTICLE  COMPSYNT2 POSITION  COMPTYPE SUBSTYPE2 VARIANT 
No :832 NP  :342 Fin :535 Hum :435 Comp : 2 Lieu :504 
Yes:172 DetPoss :334 Init:284 SoA :232 Conc : 12 Place:500 
      NFClau :238 Med :185 Conc :160 Contr:426    
      SubClau : 30    Abstr :102 Dep : 45    
      ProForm : 20    Prop : 31 Emp :104    
      PronPers: 16    Plant : 17 Repl :327    
      (Other) : 24    (Other): 27 Subst: 88    
    DECADE   GENRE2 
Min. :1500 Treat_Ess:299 
1st Qu.:1618 Novel :219 
Median :1650 Drama :143 
Mean :1644 Poetry : 86 
3rd Qu.:1680 Memoirs : 82 
Max. :1710 Corresp : 81 
       (Other) : 94 

Je voulais obtenir un dataframe pour chaque niveau de la variable « DÉCENNIE » (il y a 21 ans). Je l'ai fait ce qui suit:

> mydata.split<-split(mydata, mydata$DECADE) 

# remove the column "DECADE" since no longer needed 

> mydata.split<-lapply(mydata.split, function(x) x=x[, -7]) 

    > french.split[1:2] # outputs the first two elements of the list 
    $`1500` 
     ARTICLE COMPSYNT2 POSITION COMPTYPE SUBSTYPE2 VARIANT GENRE2 
    1  No NFClau  Med  SoA  Contr Lieu Poetry 

    $`1510` 
     ARTICLE COMPSYNT2 POSITION COMPTYPE SUBSTYPE2 VARIANT GENRE2 
    2  No PronPers  Fin  Hum  Contr Lieu  Novel 
    3  No  NP  Init  Hum  Repl Lieu  Novel 
    4  No  NP  Init  Conc  Subst Lieu Treat_Ess 

Puis, afin de croiser chaque trame de données de la liste en fonction de la variable « VARIANT », j'accédé chaque table séparément et tableau croisé appliqué dans une boucle for pour colonnes 1: n avec la colonne "VARIANT", puis essayé d'empiler toutes les trames de données en un (pour chaque décennie), sans succès.

> y1560s<-as.data.frame(mydata.split[6]) 

> for(i in 1:ncol(y1560s)){ 
    + cross.table<-table(y1560s[, i], y1560s[, 6]) 
    + data.list<-append(cross.table, data.list) 
    + big.table<-do.call(cbind, data.list) 
    + } 

Et la sortie est très étrange:

> head(big.table) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] 
    [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26] [,27] 
    [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37] [,38] [,39] [,40] 
    [,41] [,42] [,43] [,44] [,45] [,46] [,47] [,48] [,49] [,50] [,51] [,52] [,53] 
    [,54] [,55] [,56] [,57] [,58] [,59] [,60] [,61] [,62] [,63] [,64] [,65] [,66] 
    [,67] [,68] [,69] [,70] [,71] [,72] [,73] [,74] [,75] [,76] [,77] [,78] [,79] 
    [,80] [,81] [,82] [,83] [,84] [,85] [,86] [,87] [,88] [,89] [,90] [,91] [,92] 

Ce qui était attendu est une grande table comme celui ci-dessous, mais le processus a ensuite adopté est assez lourd.

> article<-table(y1560s[, 1], y1560s[, 6]) 
> compsynt<-table(y1560s[, 2], y1560s[, 6]) 
> position<-table(y1560s[, 3], y1560s[, 6]) 
> comptype<-table(y1560s[, 4], y1560s[, 6]) 
> substype<-table(y1560s[, 5], y1560s[, 6]) 
> genre<-table(y1560s[, 7], y1560s[, 6]) 
> big.table<-rbind(article, compsynt, position, comptype, substype, genre) 
> big.table 
      Lieu Place 
No   14  4 
Yes   0  3 
AdjP   0  0 
DetPoss  0  4 
Gap   0  0 
NFClau  6  0 
NP   6  2 
Num   0  0 
ProForm  2  1 
PronPers  0  0 
PronPoss  0  0 
SubClau  0  0 
Fin   7  5 
Init   2  2 
Med   5  0 
Abstr  3  1 
Act   0  0 
Anim   0  0 
Conc   2  0 
Hum   1  6 
Plant  2  0 
Prop   0  0 
SoA   6  0 
Comp   0  0 
Conc   0  0 
Contr  6  1 
Dep   0  2 
Emp   0  1 
Repl   4  2 
Subst  4  1 
Corresp  0  0 
Drama  1  1 
Memoirs  0  0 
Non-Litt  0  0 
Novel  0  1 
Other  0  0 
Pamphlet  0  0 
Poetry  0  1 
Rhetoric  0  0 
Travel  0  0 
Treat_Ess 13  4 
Undef  0  0 

est-il un moyen plus facile à 1) accéder aux trames de données stockées dans la liste des décennies et 2) pour empiler toutes les tables avec la variable « VARIANT » comme une constante pour chaque élément de la liste des décennies ?

Je vous remercie d'avance pour vos suggestions et astuces.

CBechet.

EDIT: en essayant les aspects suivants prometteurs, je ne parviens tout simplement pas à stocker les données résultantes dans une liste pour un traitement ultérieur.

> for(i in 1:length(mydata.split)) { 
+ mytable<-as.data.frame(mydata.split[i]) 
+ article<-table(mytable[, 2], mytable[, 1]) 
+ compsynt<-table(mytable[, 3], mytable[, 1]) 
+ position<-table(mytable[, 4], mytable[, 1]) 
+ comptype<-table(mytable[, 5], mytable[, 1]) 
+ substype<-table(mytable[, 6], mytable[, 1]) 
+ genre<-table(mytable[, 7], mytable[, 1]) 
+ big.table<-as.data.frame(rbind(article, compsynt, position, comptype, substype, genre)) 
} 
+0

Il est probablement là. Essayez simplement de regarder 'big.table [1: 5, 1: 5]' ou quelque chose comme ça pour vérifier que l'info est là. – A5C1D2H2I1M1N2O1R2T1

+0

Impossible d'obtenir des valeurs pour toutes ces colonnes, car elles n'existent pas réellement. Il semble que la grande table a été vectorisée. – CBechet

Répondre

1

D'après votre description et le code affiché dans votre édition, mais ne pas avoir un échantillon reproductible de vos données, je vous propose l'approche suivante.

Cela devrait atteindre la sortie que vous attendez, une très grande table avec tous les résultats crosstab.

do.call(what = rbind, args = 
      sapply(mydata.split, function(a_decade){ 
      my_table <- as.data.frame(a_decade) 
      lapply(1:7, function(a_column){ 
       table(my_table[, a_column], my_table[, 1]) 
      }) 
      }) 
) 
+0

En attendant j'ai résolu mon problème. Mais merci beaucoup pour l'astuce! – CBechet

1

convertir simplement prometteur code boucle for-lapply pour une liste de vos bigTables longueur égale à mydata.split liste:

bigTablesList <- lapply(mydata.split, function(mytable) { 
    article <- table(mytable[, 2], mytable[, 1]) 
    compsynt <- table(mytable[, 3], mytable[, 1]) 
    position <- table(mytable[, 4], mytable[, 1]) 
    comptype <- table(mytable[, 5], mytable[, 1]) 
    substype <- table(mytable[, 6], mytable[, 1]) 
    genre <- table(mytable[, 7], mytable[, 1]) 
    as.data.frame(rbind(article, compsynt, position, comptype, substype, genre)) 
})