【问题标题】:Error in If statment in RR中的If语句错误
【发布时间】:2015-08-17 14:49:25
【问题描述】:

下面是代码。似乎我没有设法正确定义向量“nobs”、“cor”,并且 if 语句试图评估 NA 值。 有人可以指出我的错误吗? 谢谢, 塔米尔

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)

}

【问题讨论】:

  • 你的代码,就目前而言,是错误的。使其可重现。
  • 为了帮助您朝着正确的方向前进: 1. 您不是在迭代向量。 2.您使用变量进行索引(n和i),然后增加n然后尝试访问存储在该位置的数据。 3 你使用一个基函数的名字(cor)作为变量名)。 4. 您错误地访问了数据框的列。

标签: r if-statement


【解决方案1】:

代码并不遥远。我更改了n &lt;- n+1 的位置。在您的示例中,它在函数中增加得太早了。当函数下降到 if(nobs[n]&gt;threshold) 时,它会在你执行 n+1 之后进行检查,所以它始终是 NA

其次,我在污染物名称周围加上引号。

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

我们可以测试:

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

两者都匹配所需的输出。

【讨论】:

  • 谢谢皮埃尔。它效果更好,但与您的结果不同。为什么对象'id'、'nobs'和'cor'不是向量而是整数?
猜你喜欢
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
相关资源
最近更新 更多