【问题标题】:Undefined Columns Selected v. duplicate 'row.names' are not allowedUndefined Columns Selected v. 不允许重复的“row.names”
【发布时间】:2015-07-31 22:44:09
【问题描述】:

在 for 循环中,我试图在我的数据框中的两列数据之间运行一个函数,并在循环的每个交互中移动到另一个数据集。我想将 for 循环的每个输出输出到一个答案向量中。

我无法通过以下错误(在我的代码下方列出),具体取决于我是否将 row.names = NULL 添加或删除到 data 部分以下代码(for循环的第4行):

** 编辑以包含目录引用,错误最终是:

corr <- function(directory, threshold = 0) {
  source("complete.R")

上面的代码/我看不见的目录组织是我的错误所在

  lookup <- complete("specdata")
  setwd(paste0(getwd(),"/",directory,sep=""))
  files <-list.files(full.names="TRUE") #read file names
  len <- length(files)   
  answer2 <- vector("numeric") 
  answer <- vector("numeric")
  dataN <- data.frame()
      for (i in 1:len) {
          if (lookup[i,"nobs"] > threshold){
               # TRUE -> read that file, remove the NA data and add to the overall data frame
               data <- read.csv(file = files[i], header = TRUE, sep = ",")
               #remove incomplete
               dataN <- data[complete.cases(data),]
               #If yes, compute the correlation and assign its results to an intermediate vector.

        answer<-cor(dataN[,"sulfate"],dataN[,"nitrate"])
        answer2 <- c(answer2,answer)
      }
    }

setwd("../") 返回(答案2) }

1) read.table 中的错误(file = file, header = header, sep = sep, quote = quote, : 不允许重复的 'row.names'

对比)

2) [.data.frame(data, , 2:3) 中的错误:选择了未定义的列

我的尝试

  1. 直接引用列名“colA”
  2. 在 for 循环之前初始化 data 和 dataN 以清空 data.frames
  3. 将 answer2 初始化为空向量
  4. 更好地了解向量、矩阵和 data.frames 如何相互配合

** 谢谢!**

【问题讨论】:

  • 您的代码不是很有效并且“R-ish”,但我认为它应该可以工作。您确定您正在阅读正确的 .csv 文件吗?
  • 谢谢马拉。是的,它是一个正确的 csv 文件。 (逗号分隔的文本)您会推荐哪些效率更改?

标签: r for-loop vector directory-structure


【解决方案1】:

我的问题是我在上面的代码中引用了函数 .R 文件,与我循环和分析的数据文件位于同一目录中。我的“文件”向量的长度不正确,因为它正在读取我在函数前面创建和引用的另一个 .R 函数。我相信这个 R 文件是创建“未定义列”的原因

我很抱歉,我什至没有在问题所在的地方放置正确的代码区域。

关键要点:您始终可以在函数内的目录之间移动!事实上,如果你想对一个感兴趣的目录的所有内容执行一个函数,这可能是非常有必要的

【讨论】:

    【解决方案2】:

    一种方法:

    # get the list of file names
    files <- list.files(path='~',pattern='*.csv',full.names = TRUE)
    
    # load all files
    list.data <- lapply(files,read.csv, header = TRUE, sep = ",", row.names = NULL)
    
    # remove rows with NAs
    complete.data <- lapply(list.data,function(d) d[complete.cases(d),])
    
    # compute correlation of the 2nd and 3rd columns in every data set
    answer <- sapply(complete.data,function(d) cor(d[,2],d[,3]))
    

    相同的想法,但实现略有不同

    cr <- function(fname) {
        d <- read.csv(fname, header = TRUE, sep = ",", row.names = NULL)
        dc <- d[complete.cases(d),]
        cor(dc[,2],dc[,3])
    }
    answer2 <- sapply(files,cr)
    

    CSV 文件示例:

    # ==> a.csv <==
    #     a,b,c,d
    # 1,2,3,4
    # 11,12,13,14
    # 11,NA,13,14
    # 11,12,13,14
    # 
    # ==> b.csv <==
    #     A,B,C,D
    # 101,102,103,104
    # 101,102,103,104
    # 11,12,13,14
    

    【讨论】:

    • 再次感谢@Marat 我尝试将第二组代码合并到我的 if 语句和 for 循环中。现在我收到错误“read.table 中的错误(file = file, header = header, sep = sep, quote = quote, : more columns than column names”,这与选择的“未定义列”略有不同。第一种方法你提到聚合了我的文件,但我想单独遍历每个文件,所以我无法弄清楚如何将它应用到我的场景中.我查看了我的代码的不同部分,以及 nocol(data)正如我所期望的那样。所以我仍然很难过。
    • @Kara_F,使用第一种方法,您仍然可以查看每个数据集,它们只是被组织为列表元素。由于您在使用 read.table 时遇到问题,我认为 .csv 文件的名称或其内容有问题。
    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 2014-12-13
    • 2020-12-10
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多