2013-10-21 53 views
0

我遇到了問題。 這是我對R指令:R,循環,缺失值,包含數據的大文件

myfiles <- list.files("D:/dolnyslask/2011/after", pattern=".csv") 
for (j in 1:length(myfiles)) { 
thisfile <- read.csv(myfiles[j], header = T, sep=";", na.string="NA", comment.char="") 
for (i in thisfile) { 
x = sd(i, na.rm=T) 
y = length (na.omit(i)) 
if (y == 0) { 
cat(file=myfiles[j], append=F, (paste("-","\t"))) 
{cat(file=myfiles[j], append=F, (paste("-", "\t"))) 
{cat(file=myfiles[j], append=F, (paste("-", "\t"))) 
{cat(file=myfiles[j], append=F, (paste("-", "\t"))) 
{cat(file=myfiles[j], append=F, (paste("-", "\t"))) 
{cat(file=myfiles[j], append=F, (paste("-", "\t"))) 
{cat(file=myfiles[j], append=F, (paste("-", "\t"))) 
{cat(file=myfiles[j], append=F, (paste("-", "\t"))) 
{cat(file=myfiles[j], append=F, (paste("-", "\t"))) 
{cat(file=myfiles[j], append=F, (paste("-", "\t"))) 
{cat(file=myfiles[j], append=F, (paste("-", "\t"))) 
{cat(file=myfiles[j], append=F, paste(length(na.omit(i)), "\n")) 
}}}}}}}}}}} 
} else if (x == 0) { 
cat(file=myfiles[j], append=F, paste(format(min(i, na.rm=T), digits=5),"\t")) 
{cat(file=myfiles[j], append=F, paste(format(mean(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(max(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(median(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(sd(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(mean(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(mean(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(mean(i, na.rm=T) - mean(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(mean(i, na.rm=T) - mean(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format((mean(i, na.rm=T) - mean(i, na.rm=T))/median(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format((mean(i, na.rm=T) - mean(i, na.rm=T))/median(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(length(na.omit(i)), "\n")) 
}}}}}}}}}}} 
} else { 
cat(file=myfiles[j], append=F, paste(format(min(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(mean(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(max(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(median(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(sd(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(t.test(na.omit(i), conf.level=0.90)$conf.int, digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format(t.test(na.omit(i), conf.level=0.90)$conf.int - mean(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(format((t.test(na.omit(i), conf.level=0.90)$conf.int - mean(i, na.rm=T))/median(i, na.rm=T), digits=5), "\t")) 
{cat(file=myfiles[j], append=F, paste(length(na.omit(i)), "\n")) 
}}}}}}}} 
} 
} 
} 

我工作的CSV文件(約600)(不同年份),它們中的哪一個看起來是這樣的:

1 NA NA NA NA NA NA 4.0 NA NA 10.0 NA NA  NA 
2 NA NA NA NA NA NA 12.1 NA NA 8.5 NA NA  NA 
3 NA NA NA NA NA NA 14.8 NA NA 6.0 NA NA  NA 
4 NA NA NA NA NA NA 15.0 NA NA 7.4 NA NA  NA 
5 NA NA NA NA NA NA 16.0 NA NA 8.0 NA NA  NA 
6 NA NA NA NA NA NA 15.0 NA NA 6.5 NA NA  NA 
7 NA NA NA NA NA NA 17.8 NA NA 5.8 NA NA  NA 
8 NA NA NA NA NA NA 16.4 NA NA 6.7 NA NA  NA 
9 NA NA NA NA NA NA 11.7 NA NA 7.7 NA NA  NA 
10 NA NA NA NA NA NA 7.4 NA NA 10.9 NA NA  NA 
11 NA NA NA NA NA NA 3.8 NA NA NA NA NA  NA 

但他們更大更大。

當我在示例中使用我的循環時,它工作。但是當我用它來做數據時,我需要這樣做,R返回:

Error in if (x == 0) { : missing value where TRUE/FALSE needed 

並停止循環。

我每次都在一個文件上有這個問題... 我檢查了一切,我不知道,我可以犯什麼錯誤。請幫幫我。我只使用R幾個星期...但我檢查了每一個提示,我發現在網上...

也許你也可以告訴我,如何寫(我的情況下)我的文件相同名字但是fe在不同的目錄? 非常感謝你! Anna

+0

...並使用這些類型的嵌套'cat'語句可能不是很有效。 –

回答

0

您會收到一個錯誤beacuase x是一個缺失值,您嘗試將其與數字進行比較。重現錯誤。

x <- NA 
if(x==0)cat(x) 
Error in if (x == 0) cat(x) : missing value where TRUE/FALSE needed 

所以這個正確的問題:

if(x==0 || is.na(x))cat(x) 

但這裏的一些言論對你很不好代碼:

  1. 沒有必要在這裏使用for。改爲使用lapply
  2. 你想和你做什麼嵌套的貓?驚人!

比如我會寫這樣的事:

lapply(ff in myfiles){ 
    thisfile <- read.csv(ff, header = T, sep=";", 
         na.string="NA", comment.char="") 
    lapply(thisfile,function(col){ 
    x = sd(col, na.rm=T) 
    y = length (na.omit(col)) 
    if (y == 0) { ## do something here 
    } else if (is.na(x) || x == 0) { ## do something here 
     else { ## do something here 

     } 
    } 
+0

好吧,我明白!非常感謝。我想我現在會做得更好!我會用你的建議! –