R,循环,缺失值,带有数据的大文件

时间:2013-10-21 16:27:34

标签: r loops missing-data

我遇到了问题。 这是我对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几个星期...但我检查了每个提示,我在网上找到了......

也许你也可以告诉我,如何写(在我的情况下)我的文件同名,但f.e.在不同的目录? 非常感谢你! 安娜

1 个答案:

答案 0 :(得分: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. 你想和你做什么嵌套猫?太神奇了!
  3. 例如我会写这样的东西:

    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
    
          }
      }