2015-08-17 1 views
-1

ci-dessous est le code. Il semble que je n'ai pas réussi à définir les vecteurs 'nobs', 'cor' correctement et l'instruction if essaye d'évaluer une valeur NA. Quelqu'un peut-il me signaler mon erreur? Merci, TamirErreur dans Si la déclaration dans R

corr<-function(directory, threshold=0){ 

allfiles<-list.files("specdata", full.names = TRUE) 
NumOfFiles<-length(allfiles) 

n<-1 
id<-vector() 
nobs<-vector() 
cor<-vector() 

for (i in NumOfFiles){ 
    data<-read.csv(allfiles[i]) 
    cleandata<-data[complete.cases(data),] 
    id[n]=i 
    nobs[n]<-sum(complete.cases(data)) #Number of completre cases 
    n<-n+1 


if (nobs[n]>threshold){ 
    cor[n]<-cor(cleandata[sulfate],cleandata[nitrate]) 
    } 
} 

return(cor) 

}

+3

Votre code, tel qu'il est, est erroné. Rendez-le reproductible. – Khashaa

+0

Pour vous aider dans la bonne direction: 1. vous n'écrivez pas sur un vecteur. 2. vous utilisez des variables pour l'indexation (n et i), et vous augmentez n, puis essayez d'accéder aux données stockées à cette position. 3 vous utilisez le nom d'une fonction de base ('cor') comme nom de variable). 4. Vous accédez incorrectement aux colonnes de votre dataframe. – Heroka

Répondre

1

Le code était pas loin. J'ai changé la position de n <- n+1. Dans votre exemple, il incrémentait trop tôt dans la fonction. Lorsque la fonction est descendue à if(nobs[n]>threshold), elle vérifiait APRÈS avoir fait n + 1, donc c'était toujours NA. Deuxièmement, je mets des guillemets autour des noms de polluants.

corr<-function(directory, threshold=0){ 

allfiles<-list.files("specdata", full.names = TRUE, pattern="csv") 
NumOfFiles<-length(allfiles) 

n<-1 
id<-vector() 
nobs<-vector() 
cor<-vector() 

for (i in 1:NumOfFiles){ 
    data<-read.csv(allfiles[i]) 
    cleandata<-data[complete.cases(data),] 
    id[n]=i 
    nobs[n]<- sum(complete.cases(data)) #Number of completre cases 

    if (nobs[n]>threshold){ 
     cor[n]<-cor(cleandata[,"sulfate"],cleandata[,"nitrate"]) 
     n<-n+1 
     } 

} 

return(cor) 
} 

Nous pouvons tester avec:

summary(corr("specdata")) 
    Min. 1st Qu. Median  Mean 3rd Qu.  Max. 
-1.00000 -0.05205 0.10840 0.13800 0.27890 1.00000 

cr <- corr("specdata", 150) 
head(cr) 
[1] -0.01895754 -0.14051254 -0.04389737 -0.06815956 
[5] -0.12350667 -0.07588814 

qui correspondent à la fois la sortie désirée.

+0

Merci Pierre. Cela fonctionne mieux mais pas avec les mêmes résultats que vous avez. Pourquoi les objets 'id', 'nobs' et 'cor' ne sont-ils pas des vecteurs mais des entiers? – Tamir

+0

Ce sont des vecteurs. –