繁体   English   中英

NA列之间的相关性

[英]Correlation between NA columns

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

我的代码看起来像这样

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

没有错误信息

如果我输入

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

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM