Bonjour à tous. J'essaye depuis une bonne semaine de résoudre un problème de format de données.

En effet, avec un premier script R je crée une data.frame que j'ai sauvegardé dans un fichier.txt de type :

"µ2013-03-27_11h53m_Subject 2.txt","µ2013-03-28_11h08m_Subject 2.txt","Mean","SEM"
"Type",G1D2,G1D2,G1D2,G1D2
"Early Error",3,0,1.5,2.12
"DuringLight_0%",0,0,0,0
"DuringLight_50%",10,5,7.5,3.54
"DuringLight_100%",0,0,0,0
"Omission_0%",0,0,0,0
"Omission_50%",21,2,11.5,13.44
"Omission_100%",0,0,0,0
"TR0%",NaN,NaN,NaN,NA
"TR50%",580.71,337.05,458.88,172.29
"TR100%",NaN,NaN,NaN,NA
"DelaiAppuiD0%",NaN,NaN,NaN,NA
"DelaiAppuiD50%",219.91,132.91,176.41,61.52
"DelaiAppuiD100%",NaN,NaN,NaN,NA
"DelaiAppuiG0%",NaN,NaN,NaN,NA
"DelaiAppuiG50%",600,238.67,419.33,255.5
"DelaiAppuiG100%",NaN,NaN,NaN,NA
"NombreAppuisD0%",0,0,0,0
"NombreAppuisD50%",107,90,98.5,12.02
"NombreAppuisD100%",0,0,0,0
"NombreAppuisG0%",0,0,0,0
"NombreAppuisG50%",15,30,22.5,10.61
"NombreAppuisG100%",0,0,0,0
"MT_From_RIGHT_0%",NaN,NaN,NaN,NA
"MT_From_RIGHT_50%",1553.83,1483.78,1518.8,49.53
"MT_From_RIGHT_100%",NaN,NaN,NaN,NA
"MT_From_LEFT_0%",NaN,NaN,NaN,NA
"MT_From_LEFT_50%",1325.33,929.67,1127.5,279.77
"MT_From_LEFT_100%",NaN,NaN,NaN,NA
"ConsumptionTime_BIG_Reward",4125.66,4846.63,4486.15,509.8
"ConsumptionTime_SMALL_Reward",3639.23,3483.33,3561.28,110.24
"Ratio (entree mangeoire malgre erreur)",0,0,0,0
Je répète cette opération pour plusieurs fichiers. J'obtiens donc n fichiers.txt

Jusque-là, pas de soucis. J'ouvre ensuite un deuxième script avec lequel, sur l'ensemble des fichiers, je récupère une seule colonne de chaque fichier que je regroupe en un seul data.frame :

"names" est le vecteur de mes noms de fichiers à ouvrir.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
X<-1
 
 
MEAN<-lapply(names, function(fichier) {
     data1 <- read.table(fichier, skip=X, header=T, sep=",", dec=".", quote="")
 
     a<-data1[ncol(data1)-1]
 
         return(a)  
})
 
tab <- do.call(cbind, MEAN)
# Ici 'MEAN' n'a pas de rapport avec le fonction 'mean()' c'est juste que les valeurs des colonnes que je récupère correspondent à des moyennes calculées dans le premier script.


J'obtiens ceci :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
> tab
 
      G1D2  G1D2.2  G1D2.2  G1D2.2  G1D2.2  G1D2.2
1     4.00    0.00    1.50    0.00    1.50    1.50
2     0.00    0.00    0.00    0.00    0.00    0.00
3     0.00    1.00    7.50    2.00    0.00    0.00
4     6.00    5.50    0.00    0.00   15.50   15.50
5     0.00    0.00    0.00    0.00    0.00    0.00
6     0.00    0.00   11.50    0.00    0.00    0.00
7     3.00    0.50    0.00    0.00   15.00   15.00
8      NaN     NaN     NaN     NaN     NaN     NaN
9      NaN     NaN  458.88  348.50     NaN     NaN
10  254.96     NaN     NaN     NaN  311.80  311.80
11     NaN     NaN     NaN     NaN     NaN     NaN
12     NaN     NaN  176.41  259.28     NaN     NaN
13  443.52     NaN     NaN     NaN  108.40  108.40
14     NaN     NaN     NaN     NaN     NaN     NaN
15     NaN     NaN  419.33  247.70     NaN     NaN
16  335.69     NaN     NaN     NaN  305.84  305.84
17    0.00    0.00    0.00    0.00    0.00    0.00
18    0.00   31.50   98.50   69.00    0.00    0.00
19   55.00   57.50    0.00    0.00   52.00   52.00
20    0.00    0.00    0.00    0.00    0.00    0.00
21    0.00   28.50   22.50   51.00    0.00    0.00
22   66.00    2.50    0.00    0.00   69.00   69.00
23     NaN     NaN     NaN     NaN     NaN     NaN
24     NaN     NaN 1518.80 1114.43     NaN     NaN
25 1687.09     NaN     NaN     NaN 1193.66 1193.66
26     NaN     NaN     NaN     NaN     NaN     NaN
27     NaN     NaN 1127.50  756.08     NaN     NaN
28 1945.00     NaN     NaN     NaN 1136.99 1136.99
29 5825.56 6934.57 4486.15 4795.80 5810.57 5810.57
30 3489.08 4782.36 3561.28 3653.67 3321.92 3321.92
31    0.00    0.00    0.00    0.00    0.00    0.00

Je remplace ensuite la valeur 'NaN' par 0.1 :


Et j'applique une petite formule pour me faire la moyenne pour une ligne sans tenir compte de la valeur '0.1' :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
> EC<-function(x) round(((sd(x))/(sqrt(length(names)-1))),2) # Formule SEM
 
t<-tab[1,]
a2<-vector()
for (i in 1:length(t))
if (t[i]!=0.1) {a2[i]<-t[i]}
t<-na.omit(a2)
as.vector(t)
t1<-mean(t)
s1<-EC(t)
Et j'obtiens les erreurs suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
> t1<-mean(t)
Message d'avis :
In mean.default(t) :
  l'argument n'est ni numérique, ni logique : renvoi de NA
> s1<-EC(t)
Erreur : is.atomic(x) is not TRUE
En effet, "t" possède des levels (G1D2...) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
> mean(t)
  G1D2 G1D2.2 G1D2.2 G1D2.2 G1D2.2 G1D2.2 
   4.0    0.0    1.5    0.0    1.5    1.5 
Message d'avis :
mean(<data.frame>) is deprecated.
 Use colMeans() or sapply(*, mean) instead.
Je suppose que ce sont ces levels qui posent problème, mais je n'arrive pas à les enlever malgré de multiples fonctions comme "drop=T", ni même si je fais "as.vector(t)"...

Ni même encore, si je fais ce que R me dit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
> sapply(t,mean)
  G1D2 G1D2.2 G1D2.2 G1D2.2 G1D2.2 G1D2.2 
   4.0    0.0    1.5    0.0    1.5    1.5 
> t
  G1D2 G1D2.2 G1D2.2 G1D2.2 G1D2.2 G1D2.2
1    4      0    1.5      0    1.5    1.5
> colMeans(t)
  G1D2 G1D2.2 G1D2.2 G1D2.2 G1D2.2 G1D2.2 
   4.0    0.0    1.5    0.0    1.5    1.5
Quelqu'un aurait-il une suggestion sur l'erreur que je dois faire et que je ne trouve pas ? Dois-je supprimer les "dimnames" de mon fichier txt ?

Je confirme que je ne comprends pas complètement les levels(). Je sais juste que c'est un ensemble de "valeurs" rattachées à une variable qualitative, si j'ai bien compris...