2014-01-20 52 views
-1

我必须编写一个函数,其中包含数据文件的目录和完整案例的阈值,并计算每个文件中硫酸盐和硝酸盐(两列)之间的相关性,其中完全观察到的病例数量所有变量)大于阈值。该函数应返回满足阈值要求的监视器的相关向量。如果没有文件符合阈限要求,则函数应该返回长度的数字矢量0这个函数的原型如下NA列之间的相关性

我的代码看起来像这样

corr <- function(directory,threshold=0){ 
    a<-list.files("specdata") 
    for (i in a) { 
     data <- read.csv(paste(directory, "/", i, sep ="")) 
     x<-complete.cases(data) 
     j<-sum(as.numeric(x)) 
     sulfate<-data[,2] 
     nitrate<-data[,3] 
     b<-cor(sulfate,nitrate) 
    } 
    if (j>threshold) 
     return(b) 
    else 
     numeric() 
} 

没有错误messege

如果键入

ž< -corr( “specdata”)

头(z) [1]不适用

我不知道问题是什么。我不知道列中的NA值是否与它有关。我认为我的代码中缺少一些东西。我认为read.csv在每个文件需要一个数据帧时创建一个唯一的数据帧,但我不明白为什么在这种情况下返回值是NA(当没有阈值时)。

但是,如果我介绍一个更大的阈值(1000):

z<-corr("specdata",1000) 
head(z) 
numeric(0) 

预期输出我需要的是

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

'硫酸<-data [X,2];硝酸盐<-data [x,3]' – Roland

+0

好吧,现在它似乎正在工作,但不是预期的输出。难道是这些文件未被正确加载?我的csv文件在001,002,003,...,但我没有使用sprintf(%03d),因为我使用了list.files,而这似乎工作。 –

+0

您在循环中覆盖b。 –

回答

0

这个问题将可能是最好被分成两个步骤 - 计算每个文件的值并收集所有文件的结果。

corr.file <- function(filename) { 
    data <- read.csv(paste(directory, "/", i, sep ="")) 
    x <- complete.cases(data) 
    sulfate <- data[,2] 
    nitrate <- data[,3] 
    b <- cor(sulfate,nitrate) 
    if (j>threshold) return(b) else return(numeric()) 
} 

a <- list.files("specdata") 
correlations <- sapply(a, corr.file) 
2
this is the correct and running solution you can refer to this 

corr <- function(directory, threshold = 0) { 
    ## 'directory' is a character vector of length 1 indicating the location of 
    ## the CSV files 

    ## 'threshold' is a numeric vector of length 1 indicating the number of 
    ## completely observed observations (on all variables) required to compute 
    ## the correlation between nitrate and sulfate; the default is 0 

    ## Return a numeric vector of correlations 
    df = complete(directory) 
    ids = df[df["nobs"] > threshold, ]$id 
    corrr = numeric() 
    for (i in ids) { 

    newRead = read.csv(paste(directory, "/", formatC(i, width = 3, flag = "0"), 
          ".csv", sep = "")) 
    dff = newRead[complete.cases(newRead), ] 
    corrr = c(corrr, cor(dff$sulfate, dff$nitrate)) 
    } 
    return(corrr) 
} 
complete <- function(directory, id = 1:332) { 
    f <- function(i) { 
    data = read.csv(paste(directory, "/", formatC(i, width = 3, flag = "0"), 
          ".csv", sep = "")) 
    sum(complete.cases(data)) 
    } 
    nobs = sapply(id, f) 
    return(data.frame(id, nobs)) 
} 
cr <- corr("specdata", 150) 
head(cr) 
+0

我建议不要将答案发布到课程作业 – alexsuslin