1. ホーム
  2. r

[解決済み] Rのエラーを理解しようとしている。FUN(X[[i]], ...) のエラー: すべての数値変数を持つデータフレームでのみ定義されています。

2022-02-02 12:30:57

質問

このエラーメッセージとトレースバックが表示されるのですが。

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,])

が、別のエラーメッセージが返ってきます "エラー。(list) object cannot be coerced to type 'double'"

どうすればいいですか?

おそらく、データフレーム全体を合計しようとするのではなく、良いデータの行数をカウントする必要があるのでしょう。

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