两列完整案例中R的相关性 - 只返回向量的第一个元素?

时间:2017-07-04 01:12:12

标签: r

我是R的新手并尝试完成以下提示:

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

let openOptionsButton: UIButton = {
    let button = UIButton()
    button.setImage(#imageLiteral(resourceName: "CircleAdd"), for: .normal)
    button.addTarget(self, action: #selector(slideOverToOptions), for: .touchUpInside)
    button.contentMode = .scaleAspectFit
    return button
}()

func slideOverToOptions() {
    print("This is working")
}

func setupViews(){ 
    addSubview(openOptionsButton)

            _ = openOptionsButton.anchor(topAnchor, left: nil, bottom: nil, right: rightAnchor, topConstant: 8, leftConstant: 0, bottomConstant: 0, rightConstant: 12, widthConstant: 48, heightConstant: 48)
}

看起来程序有效,但只返回5元素向量的第一个元素:

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

spectdata<- list.files(pattern= ".csv") #creates vector with list of filenames
corr<-function(directory,threshold =0, id = 1:332){
  info<-list()
  for(i in id){
    info<-read.csv(directory[i], header=TRUE)
    NOBS<-sum(complete.cases(info))
    if (NOBS>threshold){
      return(cor(info$nitrate,info$sulfate,use="complete.obs"))
    }

  }
  corr<-sapply(spectdata,corr)
  corr<-unlist(corr[!sapply(corr,is.null)])
  return(corr)
}
cr<-corr(spectdata,threshold =150)     
head(cr)

应该是什么:

> cr<-corr(spectdata,threshold =150)     
> head(cr)
[1] -0.01895754

有人有什么想法吗?我对R很新,我很难过。如果我尝试将矢量定义为更长,我会得到相同的答案(例如0.01895754 NA NA NA NA)。

1 个答案:

答案 0 :(得分:2)

你不可能免费得到完整的答案,但假设你想学习,你的功能有很多问题。

首先您定义了两次函数:

### corr defined here
corr <- function(directory, threshold = 0) {
             spectdata<- list.files(pattern= ".csv") 
             ### corr defined here again!!
             corr<-function(directory,threshold =0, id = 1:332) {

第二次您没有指定list.files的外观:

spectdata<- list.files(pattern= ".csv") # you should add directory
                                        # I'll leave it to you to add it

第三次您的函数返回多个参数:

return(cor(info$nitrate,info$sulfate,use="complete.obs")) # 1st return
return(corr)                                              # 2nd return

第四您重复变量名称。您的函数名为corr,您将局部变量定义为corr

corr <- sapply(spectdata, corr)      ## local variable

我的建议 根据您提供的代码

首先坚持1个功能定义第一个很好
指定list.files应该看的目录 第三只返回一个参数。

You can make a vector of elements with a for loop like so:

info <- NULL
for (i in 1:4) {
    info <- c(info, i)
}

第四您不需要sapplyunlist。尽量让它在没有它们的情况下工作 第五为与函数名冲突的局部变量使用不同的变量名。

最重要逐行运行每个命令并查看每个输出。