【问题标题】:Trying to understand R error: Error in FUN(X[[i]], ...) : only defined on a data frame with all numeric variables试图理解 R 错误:FUN(X[[i]], ...) 中的错误:仅在具有所有数值变量的数据帧上定义
【发布时间】:2016-06-25 20:44:49
【问题描述】:

我一直收到此错误消息和回溯:

Error in FUN(X[[i]], ...) : 
  only defined on a data frame with all numeric variables 

5 stop("only defined on a data frame with all numeric variables") 
4 FUN(X[[i]], ...) 
3 lapply(args, function(x) {
    x <- as.matrix(x)
    if (!is.numeric(x) && !is.complex(x)) 
        stop("only defined on a data frame with all numeric variables") ... 
2 Summary.data.frame(structure(list(Date = structure(c(279L, 285L, 
291L, 297L, 303L, 315L, 321L, 327L, 333L, 339L, 345L, 357L, 363L, 
369L, 375L, 387L, 393L, 399L, 405L, 417L, 423L, 429L, 435L, 441L, 
447L, 453L, 477L, 501L, 555L, 561L, 567L, 573L, 579L, 585L, 591L,  ... 
1 corr("specdata") 

根据我的研究,这似乎意味着我的数据集中存在非数字数据。我使用的数据集来自 Coursera 课程,如果是这样的话,我会假设其他人会遇到和我一样的问题,但在任何讨论中似乎都没有提及板子或网上的类似问题。我唯一的猜测是这是我的函数代码的结果,如下所示:

corr <- function(directory, threshold = 0) {

vect1 <- numeric()
files_list <- list.files(directory, full.names = TRUE)

for (i in 1:332) {

    data <- read.csv(files_list[i])
    good <- complete.cases(data)
    complete_data <- data[good,]
    sulfate <- complete_data[,2]
    nitrate <- complete_data[,3]

        if (sum(complete_data) >= threshold) {
            b <- cor(sulfate,nitrate)
            vect1 <- rbind(b)
        }
        else vect1 <- (numeric())
    }
    return(vect1)
}

从错误消息和回溯中,我“认为”在硫酸盐和硝酸盐柱上运行关联时会发生错误。当我只在目录中的第一个文件上运行代码时,它运行良好,没有错误消息。关于为什么会发生此错误以及如何修复它的任何帮助或见解都会有所帮助。

我试图将数据集强制转换为数字 -

complete_data <- as.numeric(data[good,])

但我收到一条不同的错误消息“错误:(列表)对象不能被强制输入'double'”

【问题讨论】:

  • 这可能是 nitratesulfur 被读取为因素,或者您的 if 语句更可能试图获取包含非数字值的 data.frame 的总和。 if(nrow(complete_data) &gt;= threshold) 可能会更好?
  • 谢谢你,Tad - 这确实是导致错误消息的问题!感谢您的帮助!

标签: r


【解决方案1】:

答案是我无法对对象“complete_data”求和。我的意思是对逻辑向量“好”求和,但犯了一个错误并试图对错误的对象求和。我改用了完整数据的 nrow 计数,这解决了我的问题!

【讨论】:

    【解决方案2】:

    也许您应该计算好数据中的行数,而不是尝试对整个数据框求和。

    if (nrow(complete_data) >= threshold) {
        b <- cor(sulfate,nitrate)
        vect1 <- rbind(b)
    }
    

    【讨论】:

    • 感谢您发现这一点 - 它并没有解决我所写的错误,但它确实阻止了另一个错误。
    • @LauraJaneDefibaugh 如果没有解决错误,您不需要将其标记为解决方案,否则会误导未来的读者
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多