Rにおけるトップ10のエラーとそれらを修正する方法
『トップ10のエラーとその修正方法』におけるRの成功術
Rを始めたばかりの人は、コードにエラーが多く出ることにより、実行ができないことがよくあります。私がRを使い始めた頃を思い出しますが、コードのエラーは非常に頻繁で、プログラミング言語を学ぶことをあきらめそうになりました。問題の原因がわからなくて困っていたため、何度かExcelに戻って解析を終えたこともあります。
幸いにも、最初の困難にもかかわらず、私は自分自身を続けるようにしました。そして、今日では、Rコードを書くたびにエラーに遭遇することがほとんどありますが、経験と実践により、エラーの修正にかかる時間はだんだんと短くなっています。始めの段階で苦戦しているなら、安心してください。新しいプログラミング言語を学ぶ際には、誰もが苦労するものです(このようなことはRだけでなく、他の言語でも同様です)。
この記事では、Rでよくある10のエラーとその修正方法を紹介します。もちろん、エラーはコードと分析によって異なるため、すべてをカバーすることは不可能です(それに関してはGoogleが私よりもうまくやってくれます)。ただし、Rを学ぶ際によくある構文の間違いに焦点を当て、私自身の経験や教えている学生が遭遇するエラーについて紹介したいと思います。解決策が目の前にあることに気付くまでには、ときには長い時間がかかることもあります。
- 「時系列分析における移動平均の総合ガイド」
- データウェアハウスとデータレイクとデータマート:どれを選ぶべきか、助けが必要ですか?
- 機械学習のオープンデータセットを作成中ですか? Hugging Face Hubで共有しましょう!
このリストは私の個人的な経験と、私がRを教えている学生たちが遭遇するエラーに基づいています。このリストは完全ではないため、コメント欄(記事の末尾にあります)でよく遭遇するエラーを自由にコメントしてください。
各エラーについて、具体的な例と修正方法を提供します。また、投稿の最後にはエラーではないが警告がある場合にも触れます。
1. 括弧、波括弧、角括弧、引用符の対応が取れていない
比較的些細ながらも頻繁に起こるエラーとして、閉じる括弧、波括弧、角括弧、引用符が漏れるというものがあります。
この種のエラーは多くのプログラミング言語で適用されます。たとえば、Rでは次のようなエラーがあります:
## closing parenthesisがない場合:mean(c(1, 7, 13) ## "else"の前に波括弧が抜けている場合:x <- 7 if(x > 10) { print("x > 10") else { print("x <= 10") } ## 角括弧が抜けている場合:summary(ggplot2::diamonds[, "price")## 第2の要素に閉じる引用符が抜けている場合:grp <- c("Group 1", "Group 2) grp
このようなエラーは、コードが基本的な場合には簡単に検出できますが、より複雑なコードになると見つけにくくなります。たとえば次のようなものです:1
for (i in y) { for (j in x) { p <- ggboxplot(dat, x = colnames(dat[j]), y = colnames(dat[i]), color = colnames(dat[j]), legend = "none", palette = "npg", add = "jitter" ) print( p + stat_compare_means(aes(label = paste0(..method.., ", p-value = ", ..p.format..), method = method1, label.y = max(dat[, i], na.rm = TRUE) ) + stat_compare_means(comparisons = my_comparisons, method = method2, label = "p.format") ) }
幸いなことに、RStudioを使用している場合、開いた括弧、波括弧、角括弧、引用符を自動的に閉じるように書かれます。
パッケージをインストールする際には、パッケージの名前を (シングルまたはダブルの) 引用符で囲む必要があります:
## 正しくない:install.packages(ggplot2)
## Error in install.packages : object 'ggplot2' not found
代わりに、次の2つのオプションのいずれかを選択してください:
# install.packages("ggplot2")# install.packages('ggplot2')
解決策
解決策は、単純に、すべての開いた括弧、波括弧、角括弧、引用符に対応する閉じる括弧、波括弧、角括弧、引用符を付けることです:
<pre><code>mean(c(1, 7, 13)) ## [1] 7 x <- 7 if (x > 10) { print("x > 10")} else { print("x <= 10")} ## [1] "x <= 10" summary(ggplot2::diamonds[, "price"]) ## price ## Min. : 326 ## 1st Qu.: 950 ## Median : 2401 ## Mean : 3933 ## 3rd Qu.: 5324 ## Max. :18823 grp <- c("Group 1", "Group 2") grp ## [1] "Group 1" "Group 2"
</pre><p>コンマを正しく配置するようにしてください。</p><ul><li>コンマが間違って配置されています:</li></ul><pre><code>## NOT correct (misplaced comma):c("Group 1," "Group 2") ## Error: unexpected string constant in "c("Group 1," "Group 2"" ## also NOT correct (missing comma):c("Group 1" "Group 2") ## Error: unexpected string constant in "c("Group 1" "Group 2"" ## correct:c("Group 1", "Group 2")</pre><ul><li>同じ要素でシングルクォートとダブルクォートを混在させないようにしてください。</li></ul><pre><code>## NOT correct:c("Group 1')## correct:c("Group 1")## also correct:c('Group 1')</pre><p>注意してください、c('Group 1', "Group 2")
はエラーをスローしませんが、整合性のためには、同じベクトル内でシングルクォートとダブルクォートを混在させないことが推奨されます。</p><h1 id="using-a-function-that-is-not-installed-or-loaded">2. インストールされていないまたはロードされていない関数の使用</h1><p>次のエラーが発生した場合: "Error in … : could not find function ‘…’"、例えば:</p><p><img src="https://ai.miximages.com/statsandr.com/blog/top-10-errors-in-r/images/could-not-find-function-R.png" /></p><p>これは、まだインストールされていないまたはロードされていないパッケージに所属する関数を使用しようとしていることを意味します。</p><h3 id="solution-1">解決策</h3><p>このエラーを解決するには、パッケージをインストールする(まだインストールされていない場合)install.packages()
関数と共にロードするlibrary()
関数を使用する必要があります:</p><pre><code>## install package:install.packages("ggplot2")## load package:library(ggplot2)</code></pre><p>これら2つの関数の使用方法がわからない場合、Rでのパッケージのインストールとロードに関する詳細を参照してください。</p><h1 id="typos-in-function-variable-dataset-object-or-package-names">3. 関数、変数、データセット、オブジェクト、またはパッケージ名のタイプミス</h1><p>もう1つの一般的な間違いは、関数、変数、データセット、オブジェクト、またはパッケージの名前を誤ってスペルミスすることです。例えば:</p><pre><code>## typo in function name:maen(c(1, 7, 13)) ## Error in maen(c(1, 7, 13)) : could not find function "maen" ## typo in variable name:summary(ggplot2::diamonds[, "detph"]) ## Error: Column `detph` doesn't exist ## typo in dataset name:data <- data.frame( x = rnorm(10), y = rnorm(10))summary(dta[, 2]) ## Error in summary(dta[, 2]) : object 'dta' not found ## typo in object name:test <- c(1, 7, 13)mean(tset) ## Error in mean(tset) : object 'tset' not found ## typo in package name:library("tydiverse") ## Error in library("tydiverse") : there is no package called ‘tydiverse’</pre><h3 id="solution-2">解決策</h3><p>すべての関数、変数、データセット、オブジェクト、およびパッケージの名前を正しくスペルすることを確認してください:</p><p>Rは大文字と小文字を区別することに注意してください。Rではmean()
はMean()
とは異なるものとみなされます!</p>
mean(c(1, 7, 13))
## [1] 7
summary(ggplot2::diamonds[, "depth"])
## depth ## Min. :43.00 ## 1st Qu.:61.00 ## Median :61.80 ## Mean :61.75 ## 3rd Qu.:62.50 ## Max. :79.00
data <- data.frame( x = rnorm(10), y = rnorm(10))data[, 2]
## [1] 1.3048697 2.2866454 -1.3888607 -0.2787888 -0.1333213 0.6359504## [7] -0.2842529 -2.6564554 -2.4404669 1.3201133
test <- c(1, 7, 13)mean(test)
## [1] 7
library(tidyverse)
## ── コア tidyverse パッケージを添付 ──────────────────────── tidyverse 2.0.0 ──## ✔ dplyr 1.1.3 ✔ readr 2.1.4## ✔ forcats 1.0.0 ✔ stringr 1.5.0## ✔ ggplot2 3.4.3 ✔ tibble 3.2.1## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0## ✔ purrr 1.0.2 ## ── コンフリクト ───────────────────────────────────────────────── tidyverse_conflicts() ──## ✖ dplyr::filter() マスク stats::filter()## ✖ dplyr::lag() マスク stats::lag()## ℹ コンフリクトをミスにするため、conflicted パッケージ (<http://conflicted.r-lib.org/>) を使用します
綴り、関数またはデータセットが正しく指定されていることを確信しているのに、「オブジェクト ‘…’ が見つかりません」というエラーが発生する場合、オブジェクト/関数/データセットを呼び出す前にそれらが定義されていることを確認してください!
私はよく学生が彼らのコンピュータに私を呼び出すように頼まれます。なぜならば、彼らは私とまったく同じコードを実行しているのに、それが機能しないからです。ほとんどの場合、彼らのコードが私のとまったく同じであるならば、彼らは単にオブジェクト/関数/データセットを実行しておらず、そのオブジェクト/関数/データセットを含むコードを実行しようとしているだけです。言い換えれば、未定義のオブジェクトや変数を使用しようとしているのです。
Rスクリプトにコードを書くことは(コンソールとは対照的に)コンパイルされるわけではないことを覚えておいてください。実際には、コードを実行して実行し、後で使用するために実行する必要があります。まだこれに苦労している場合は、RおよびRStudioの基礎を参照してください。
4. 関数で抜けている、正しくない、または綴りが間違っている引数
ほとんどのRの関数は引数が必要です。たとえば、rnorm()
関数は、引数n
を介して指定される観測値の数を少なくとも必要とします。
強制的な引数を指定しない場合や、引数を正しく指定しない場合、コードは実行されません。さらに、引数を綴り間違えると期待通りの結果にならない場合があります:
## 強制的な引数が不足:rnorm()
## Error in rnorm() : 引数 "n" がありません,デフォルトもありません
## 正しくない引数:rnorm(n = 3, var = 1)
## Error in rnorm(n = 3, var = 1) : 使用されない引数 (var = 1)
## 綴り間違いの引数:mean(c(1, 7, 13, NA), narm = TRUE)
## [1] NA
最後のコードはエラーをスローしませんが、結果は望んだものではありません。
解決策
これらのエラーを解決するには、関数の少なくとも必須の引数を指定し、正しいものを指定してください:
rnorm()
では、分散var
の代わりに、観測値の数n
に加えて、標準偏差sd
を指定できます。NA
を削除するには、narm
の代わりにna.rm
を使用します。
rnorm(n = 3, sd = 1)
## [1] -0.3066386 -1.7813084 -0.1719174
mean(c(1, 7, 13, NA), na.rm = TRUE)
## [1] 7
もし関数の引数が心の中で覚えていない場合は、いつでも?関数名
またはhelp(関数名)
でドキュメントを確認できます。例えば:
?rnorm()## または:help(rnorm)
5. 間違った、不適切な、または矛盾したデータ型
Rにはいくつかのデータ型があり、主なものは次のとおりです:
- 数値
- 文字
- ファクター
- 論理値
特定の種類のデータに対してのみ、一部の操作や分析が可能であり適切です。
たとえば、ファクターや文字の変数の平均値を計算することは適切ではありません:
gender <- factor(c("female", "female", "male", "female", "male"))mean(gender)
## Warning in mean.default(gender): argument is not numeric or logical: returning## NA
## [1] NA
同様に、技術的には可能ですが、多くの場合、量的な連続変数の棒グラフを描くことにはあまり意味がありません。なぜなら、ほとんどの場合、各値の頻度は1であるからです:
barplot(table(rnorm(10)))
(ところで、データがすでにテーブルの形式で表示されていない場合は、barplot()
関数の内部にtable()
を追加するのを忘れないでください。)
解決策
関心のある変数に応じて、適切な操作や分析方法、データ型を使用するようにしてください。
たとえば:
- ファクター変数に対しては、頻度や相対頻度を計算し、棒グラフを描くことが適切です。
- 量的な連続変数に対しては、平均値、中央値などを計算し、ヒストグラムや箱ひげ図などを描くことが適切です。
- 論理値変数に対しては、平均値、頻度表、棒グラフが適切です。
- 文字変数に対しては、ワードクラウドが最も適しています(レベルがあまり多くない場合に限り、変数をファクター変数として考えることもできます)。
次に、Rでこれらの例を示します:
## ファクター:table(gender)
## gender## female male ## 3 2
prop.table(table(gender))
## gender## female male ## 0.6 0.4
barplot(table(gender))
## 量的な連続変数:x <- rnorm(100)summary(x)
## Min. 1st Qu. Median Mean 3rd Qu. Max. ## -2.99309 -0.74143 0.01809 -0.08570 0.58937 2.70189
par(mfrow = c(1, 2)) ## 2つのプロットを結合して表示hist(x)boxplot(x)
## 論理:x <- c(TRUE, FALSE, FALSE, TRUE, TRUE)mean(x)
## [1] 0.6
table(x)
## x## FALSE TRUE ## 2 3
barplot(table(x))
興味のある読者のために、さまざまなデータのRにおける記述統計をご覧ください。
Rにおける記述統計では、統計検定の選択は変数のタイプによって異なります。変数の数とタイプに応じて最も適切な統計検定を選ぶためのフローチャートをご覧ください。
上記のエラーに関連するエラーは、データ型の整合性が取れていないことです。以下の例で実際に確認してみましょう:
x <- c(2.4, 3.7, 5.1, 9.8)class(x)
## [1] "numeric"
y <- c(2.4, 3.7, 5.1, "9.8")class(y)
## [1] "character"
見ての通り、ベクトルx
は数値型ですが、ベクトルy
は文字列の形式です。これは、y
の最後の要素が引用符で囲まれているため(数値ではなく文字列として扱われるため)、ベクトル全体が文字列の形式を取るためです。
これは、Rにデータセットをインポートする際に、1つ以上の変数の要素が正しくエンコードされていない場合に起こります。これにより、Rによって変数全体が文字変数として扱われます。
これを防ぐためには、データセットをインポートした後にstr()
を使用してデータセットの構造を確認し、すべての変数が所望の形式であることを確認することが良い慣例です。そうでない場合は、初期ファイルの値を修正するか、Rでの形式を変更することができます(as.numeric()
を使用)。
6. ggplot2での+記号の忘れ
ggplot2を使用した表示について学び始めたばかりの場合(おすすめです!)、よくあるミスは+
記号を忘れることです。
ggplot2を使用した可視化は、複数のレイヤーを追加することで構築されることを覚えておいてください:
## パッケージを読み込む:library(ggplot2)## 最初のレイヤー、データセット:ggplot(data = diamonds) + ## 2番目のレイヤー、美学: aes(x = cut, y = price) + ## 3番目のレイヤー、プロットの種類: geom_boxplot() + ## 追加のレイヤー: theme_minimal()
解決策
ggplot2を使用したすべてのグラフィックにおいて、最後のレイヤー以外は、各レイヤーの後に+
記号を追加することを忘れないでください。
7. = と == の誤解
Rにおける代入は、最も一般的な方法から最も一般的な方法まで3つの方法で行うことができます:
<-
=
assign()
2番目の方法である=
は、==
と混同しないでください。
実際、オブジェクトを割り当てること(上記の3つの方法のどれかで)は、Rに何かを保存するために使用されます。たとえば、ベクトル(1, 3, 7)
を保存してそのベクトルをx
という名前に変更したい場合、次のように記述できます:
x <- c(1, 3, 7)## or:x = c(1, 3, 7)## or:assign("x", c(1, 3, 7))
このコードを実行すると、サイズが3のベクトルx
が「環境」タブ(RStudioのデフォルトビューを使用する場合は右上のパネル)に表示されます:
これ以降は、単に名前で呼び出してそのベクトルを使用することができます:
x
## [1] 1 3 7
決して==
でオブジェクトを割り当てることはできません:
## xにc(1, 3, 7)を割り当てるためには間違っています:x == c(1, 3, 7)
では、いつ==
を使用する必要があるのでしょうか?実際には、等号を使用したいときに使用されます。
現時点では、これは抽象的で混乱を招く可能性があると理解していますので、以下の2つのシナリオを例として考えてみましょう(これらは私たちが==
を使用する2つの一般的なケースです):
- 割り当てられたオブジェクトまたは変数が特定の条件を満たしているかどうかをチェックしたい場合、および
- 1つまたは複数の条件に基づいてデータフレームをサブセットしたい場合。
これらの例では、次のような5つの子供のサンプルを仮定してください:
## データフレームを作成:dat <- data.frame( Name = c("Mary", "Linda", "James", "John", "Patricia"), Age = c(7, 10, 3, 9, 7), Gender = c("Girl", "Girl", "Boy", "Boy", "Girl"))## データフレームを表示:dat
## Name Age Gender## 1 Mary 7 Girl## 2 Linda 10 Girl## 3 James 3 Boy## 4 John 9 Boy## 5 Patricia 7 Girl
これらの2つのシナリオを説明するために、異なるコードを書いてみましょう:
- 変数
Age
がベクトル(1, 2, 3, 4, 5)
と等しいかどうかをチェックしたい場合:
dat$Age == 1:5
## [1] FALSE FALSE TRUE FALSE FALSE
このコードでは、変数Age
の最初の要素が1と等しいか、変数Age
の2番目の要素が2と等しいかなどを尋ねます。答えはもちろんFALSE
、FALSE
、TRUE
、FALSE
、FALSE
です。なぜなら、3番目の子供だけが3歳であるためです。
- サンプリングした5人の子供のうち、どれが女の子かを知りたい場合:
dat$Gender == "Girl"
## [1] TRUE TRUE FALSE FALSE TRUE
結果は、最初、2番目、5番目の子供が女の子であり、3番目と4番目の子供は女の子ではないことを示しています。
次のいずれかの行を書くと:
## これにより、AgeとGenderが上書きされます:dat$Age = 1:5dat$Gender = "Girl"
実際には、Age
とGender
の変数が上書きされ、そのため私たちの5人の子供の年齢は1歳から5歳まで(最初の子供は1歳で、5番目の子供は5歳です)となり、全員が女の子になります。
- では、条件に基づいてデータフレームをサブセットしたい場合、つまり、7歳の子供だけを抽出したいとします:
subset(dat, Age == 7)
## Name Age Gender## 1 Mary 7 Girl## 5 Patricia 7 Girl
subset関数を使用したくない場合、角括弧も使用することができます:
dat[dat$Age == 7, ]
## Name Age Gender## 1 Mary 7 Girl## 5 Patricia 7 Girl
前の例で見るように、何かを割り当てるのではなく、変数やベクトルが「何かと等しいか?」を尋ねています。そのため、==
を使用します。
要するに、技術的な理由と2つの概念の違いを区別するために、Rは代入に=
を使用し、等号に==
を使用しています。どちらの違いを理解して、エラーを避けるために注意してください。
8. 列が未定義です
データフレームを角括弧[]
でサブセット化することに慣れている場合、subset()
やfilter()
関数ではなく、エラー「Error in [.data.frame(…) : undefined columns selected」というエラーが発生することがあります。
これは、データセットのサブセットを取得する際にRが使用することができない列が理解できない場合に発生します。
以前に紹介した5人の子供のサンプルを考えると、次のコードはエラーをスローします:
dat[dat$Age == 7]
## Error in `[.data.frame`(dat, dat$Age == 7) : undefined columns selected
これは、列の次元が指定されていないためにエラーが発生するためです。
解決策
Rのデータフレームには2つの次元があることを忘れないでください:
- 行(各実験単位ごとに1つ)
- 列(各変数ごとに1つ)
そして、この特定の順序で(つまり、行が先で、次に列)!
データフレームは2つの次元を持つため、dat[]
を呼び出すときには2つの次元が必要です。
特に、コンマで区切られた第一次元、そして次に第二次元を期待します:
dat[dat$Age == 7, ]
## Name Age Gender## 1 Mary 7 Girl## 5 Patricia 7 Girl
このコードは、Age
が7と等しいすべての行(コンマの前、つまり第一次元)を、データセットのすべての変数に対して抽出していることを意味します(その後のコンマの後に列が指定されていないため)。
興味を持った読者の方は、Rでデータをサブセット化および操作するさらなる方法をご覧ください。こちらをご覧ください。
9. データファイルのインポートまたは誤ったファイルの使用に関する問題
Rでデータセットをインポートすることは初心者にとってかなり難しいことがあります。それは主に作業ディレクトリに関する誤解によるものです。
ファイルをインポートする際に、Rはコンピュータのすべてのフォルダでファイルを検索するわけではありません。代わりに、特定の1つのフォルダのみを検索します。データセットがそのフォルダ内にない場合、次のようなエラーが発生します。「cannot open file ‘…’: No such file or directory」:
これを修正するには、データセットの場所を指定する必要があります。つまり、Rに作業するフォルダを指定する必要があります。したがって、作業ディレクトリという名前です。
作業ディレクトリを設定するには、setwd()
関数またはRStudioの右下パネルの「Files」タブを使用することができます:
また、データセットをRが現在作業しているフォルダに移動することもできます(これはgetwd()
で見つけることができます)。Rへのファイルのインポートおよび作業ディレクトリに関する詳細は、こちらをご覧ください。
関連する別の問題は、間違ったファイルを使用することです。このエラーは、前のエラーとは異なり、エラーは発生しませんが、解析結果は誤ったままになります。
ささいなことかもしれませんが、正しいデータファイルをインポートして使用することを確認してください!特に、異なる時点のファイルがあり、共通の構造を持っている場合には(たとえば、週次や月次のデータファイルで変数が完全に同じ場合)、間違った週の結果を報告したりすることがあります(幸いなことに、それほど問題にはなりませんでした)。
また、分析に含めたいすべての行を実際に使用しているか確認してください。私はモデルをテストするために(計算時間を短縮するために)、元のデータセットからランダムなサンプルを抽出し、最終的な分析を実行する際にこのサンプリングを忘れかけたことがありました。
したがって、コードをテストした後(最終結果を解釈する前)、サンプリングとフィルターを削除することをおすすめします。
10. $オペレータを使ったときの問題
このトップ10の最後のエラーについては、2つの関連するエラーに焦点を当てたいと思います:
- “$オペレータはアトミックベクトルでは無効です”
- “型’closure’のオブジェクトはサブセット可能ではありません”
これらは、どちらも$
オペレータに関連しているため、1つのセクションにまとめました。
$オペレータはアトミックベクトルでは無効です
このエラーを理解するために、まずアトミックベクトルが1次元オブジェクト(通常はc()
で作成される)であることを思い出す必要があります。これは、行が第一次元を形成し、列が第二次元に対応するデータフレームや行列とは異なるものです。
“$オペレータはアトミックベクトルでは無効です”というエラーは、ドル記号($
)を使用してアトミックベクトルの要素にアクセスしようとした場合に発生します:
## アトミックベクトルの定義:x <- c(1, 3, 7)## 名前の設定:names(x) <- LETTERS[1:3]## ベクトルの表示:x
## A B C ## 1 3 7
## 要素Cの値にアクセス:x$C
## Error in x$C : $オペレータはアトミックベクトルでは無効です
解決策
$
オペレータはアトミックベクトルから要素を抽出するために使用できません。代わりに、二重の角括弧[[]]
を使う必要があります:
x[["C"]]
## [1] 7
$
オペレータはデータフレームで使用することができるため、アトミックベクトルをデータフレームに変換してから、$
オペレータを使って名前で要素にアクセスすることでもこのエラーを修正することができます。
## アトミックベクトルをデータフレームに変換:x <- as.data.frame(t(x))## xの表示:x
## A B C## 1 1 3 7
## 要素Cの値にアクセス:x$C
## [1] 7
型’closure’のオブジェクトはサブセット可能ではありません
もう1つのエラー(Rを学ぶ際にはかなりわかりにくく混乱することを認めざるを得ません)は次のものです:“型’closure’のオブジェクトはサブセット可能ではありません”。
このエラーは、関数の一部を選択またはアクセスしようとしたときに発生します。よく知られているmean()
関数の例です:
mean[1:3]
## Error in mean[1:3] : 型'closure'のオブジェクトはサブセット可能ではありません
Rでは、リスト、ベクトル、行列、データフレームを部分的に抽出することができますが、関数は部分的に抽出できません。そのため、関数を部分的に抽出することはできないため、このエラーが発生します:
typeof(mean)
## [1] "closure"
基本的な関数(たとえばmean()
関数)を使用する場合、ほとんどの場合、このエラーに遭遇することはありません(なぜなら関数を部分的に抽出する目的はないからです…)。
実際、このエラーに遭遇することは、データセットdata
をサブセットしようとする場合ですが、このデータセットが環境内で定義されていない(インポートされていないか、適切に作成されていない)場合です。
概念を理解するために、次の例をご覧ください:
## データセットを作成:data <- data.frame( x = rnorm(10), y = rnorm(10))## 変数xの表示:data$x
## [1] 1.12288964 1.43985574 -1.09711377 -0.11731956 1.20149840 -0.46972958## [7] -0.05246948 -0.08610730 -0.88767902 -0.44468400
ここまでは問題ありません。しかし、データセットを作成する際にミスをした場合はどうなるでしょう:
## データセットを作成(ミスを含む):data <- data.frame(x = rnorm(10) y = rnorm(10))
変数x
とy
の間にカンマが欠落していることに気づくでしょう。その結果、データセットdata
は作成されず、定義されません。
したがって、今度はデータセットdata
から変数x
にアクセスしようとすると、Rは実際にはデータセットdata
ではなく、関数data
をサブセット化しようとします!
data$x
## Error in data$x : object of type 'closure' is not subsettable
これは、繰り返しますが、データセットdata
が存在しないために発生するものであり、Rはdata
という名前のオブジェクトを探し、その名前の関数を見つけます:
class(data)
## [1] "function"
警告
警告は、何かについて警告するものですが、コードの実行を妨げるものではありません。これらの警告を読むことは、貴重な情報を提供する可能性があるため、良い習慣です。
全てについて警告を挙げるのは多すぎますが、2つの一般的なものに焦点を当てたいと思います:
- 「NAs introduced by coercion」
- 「Removed … rows containing non-finite values (stat_bin())」
NAs introduced by coercion
この警告は、少なくとも1つの非数値を含むベクトルを数値ベクトルに変換しようとした場合に発生します:
x <- c(1, 3, 7, "Emma")as.numeric(x)
## Warning: NAs introduced by coercion
## [1] 1 3 7 NA
これは警告であり、エラーではないため修正する必要はありません。Rは、初期のベクトルの少なくとも1つの要素を数値に変換できないため、その要素がNA
に変換されたことを単に通知しています。
Removed … rows containing non-finite values (stat_bin())
この警告は、ggplot2を使用してプロットを描画する場合に発生します。たとえば:
ggplot(airquality) + aes(x = Ozone) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 37 rows containing non-finite values (`stat_bin()`).
同様に、警告なので修正する必要はありません。それは単に、興味のある変数にいくつかの欠損値(NA
)があることを通知し、これらの欠損値がプロットを構築するために削除されたことを伝えています。
結論
お読みいただきありがとうございます。
このエラー集が、いくつかのコーディングミスを防ぎ、またはコードのデバッグに役立つことを願っています。
エラーを修正できない場合は、関数のドキュメンテーションを読むことをお勧めします(特定の関数に苦労している場合)、または解決策をオンラインで検索することもできます。エラーに遭遇した場合、他の誰かがオンラインで答えを投稿している可能性が非常に高いです(Stack Overflowは通常、良いリソースです)。
Rは学習曲線が急であり、特に他のプログラミング言語に慣れていない場合はそう感じるかもしれません。しかし、練習と時間をかけることで、コーディングエラーが減り、より重要なことに、検索エンジンで正しいキーワードを入力する能力も向上し、問題の解決に費やす時間が短くなります。
いつものように、この記事で取り上げられたトピックに関連する質問や提案があれば、コメントとして追加してください。他の読者もディスカッションから利益を得ることができます。
この記事は最初にアントワン・ソーテーウェイによってこちらで投稿されました。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles