データから始める

最終更新日:2024-09-08 | ページの編集

概要

質問

  • Rによる最初のデータ分析

目的

  • data.frame が何なのか説明してみましょう。
  • .csv ファイルからデータ フレームに外部データを読み込みましょう。
  • データフレームの内容を要約してみましょう。
  • ファクターとは何か?
  • string と factor を変換してみましょう。
  • factor の並び替えとリネームを行ってみましょう。
  • 日付をフォーマットしてみましょう。
  • データをエクスポートして保存してみましょう。

このエピソードは、Data Carpentriesの_Data Analysis and Visualisation in R for Ecologists_レッスンに基づいています。

遺伝子発現データのプレゼンテーション


Blackmore et al. (2017)](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5544260/), The effect of upper-respiratory infection on transcriptomic changes in CNS によって発表されたデータの一部を使用する予定である。 研究の目的は、 上部呼吸器感染症が、感染後の小脳と脊髄で 起こるRNA転写の変化に及ぼす影響を調べることであった。 性別を一致させた8匹の 週齢のC57BL/6マウスに、生理食塩水または 鼻腔内経路でインフルエンザAを接種し、0日目 (非感染)、4日目、8日目に小脳と 脊髄組織におけるトランスクリプトーム変化をRNA-seqで評価した。

データセットは、カンマ区切りの値(CSV)ファイルとして保存される。 各行 は1つのRNA発現測定の情報を持ち、最初の11列 はそれを表している:

コラム 説明
遺伝子 測定された遺伝子名
サンプル 遺伝子発現を測定したサンプル名
表現 遺伝子発現の値
有機体 生物/種 - ここではすべてのデータはマウスに由来する
年齢 マウスの年齢(ここではすべてのマウスが8週齢であった)
セックス マウスの性別
感染症 マウスの感染状態、すなわちA型インフルエンザに感染しているか、感染していないか。
緊張 インフルエンザA型。
時間 感染期間(日単位)。
組織 遺伝子発現実験に使用した組織、すなわち小脳または脊髄。
マウス マウス固有の識別子。

R関数のdownload.file()を使って遺伝子発現データを含む CSVファイルをダウンロードし、 read.csv() を使ってCSVファイルの内容を data.frameクラスのオブジェクトとしてメモリにロードする。 download.fileコマンドの内部では、 の最初のエントリーは、ソースURLの文字列である。 このソースURL はGitHubリポジトリからCSVファイルをダウンロードします。 、カンマ(“data/rnaseq.csv”)の後のテキストは、 、ローカルマシン上のファイルの保存先です。 あなたのマシンに“data”というフォルダを用意し、そこにファイルをダウンロードする必要があります。 そこで、このコマンドは リモートファイルをダウンロードし、“rnaseq.csv”という名前を付けて、“data”` という名前の フォルダに追加する。

R

download.file(url = "https://github.com/carpentries-incubator/bioc-intro/raw/main/episodes/data/rnaseq.csv",
              destfile = "data/rnaseq.csv")

これでデータをロードする準備ができた:

R

rna <- read.csv("data/rnaseq.csv")

、代入は何も表示しないからだ。 、データがロードされたことを確認したい場合は、 、その名前をタイプすることでデータフレームの中身を見ることができる:

R

RNA

うわぁ…。 多くのアウトプットがあった。 少なくとも、 。 関数 head() を使って、このデータ・フレーム の先頭(最初の6行)をチェックしてみよう:

R

head(rna)

出力

     gene     sample expression     organism age    sex  infection  strain time
1     Asl GSM2545336       1170 Mus musculus   8 Female InfluenzaA C57BL/6    8
2    Apod GSM2545336      36194 Mus musculus   8 Female InfluenzaA C57BL/6    8
3 Cyp2d22 GSM2545336       4060 Mus musculus   8 Female InfluenzaA C57BL/6    8
4    Klk6 GSM2545336        287 Mus musculus   8 Female InfluenzaA C57BL/6    8
5   Fcrls GSM2545336         85 Mus musculus   8 Female InfluenzaA C57BL/6    8
6  Slc2a4 GSM2545336        782 Mus musculus   8 Female InfluenzaA C57BL/6    8
      tissue mouse ENTREZID
1 Cerebellum    14   109900
2 Cerebellum    14    11815
3 Cerebellum    14    56448
4 Cerebellum    14    19144
5 Cerebellum    14    80891
6 Cerebellum    14    20528
                                                                       product
1                               argininosuccinate lyase, transcript variant X1
2                                       apolipoprotein D, transcript variant 3
3 cytochrome P450, family 2, subfamily d, polypeptide 22, transcript variant 2
4                         kallikrein related-peptidase 6, transcript variant 2
5                Fc receptor-like S, scavenger receptor, transcript variant X1
6          solute carrier family 2 (facilitated glucose transporter), member 4
     ensembl_gene_id external_synonym chromosome_name   gene_biotype
1 ENSMUSG00000025533    2510006M18Rik               5 protein_coding
2 ENSMUSG00000022548             <NA>              16 protein_coding
3 ENSMUSG00000061740             2D22              15 protein_coding
4 ENSMUSG00000050063             Bssp               7 protein_coding
5 ENSMUSG00000015852    2810439C17Rik               3 protein_coding
6 ENSMUSG00000018566           Glut-4              11 protein_coding
                            phenotype_description
1           abnormal circulating amino acid level
2                      abnormal lipid homeostasis
3                        abnormal skin morphology
4                         abnormal cytokine level
5 decreased CD8-positive alpha-beta T cell number
6              abnormal circulating glucose level
  hsapiens_homolog_associated_gene_name
1                                   ASL
2                                  APOD
3                                CYP2D6
4                                  KLK6
5                                 FCRL2
6                                SLC2A4

R

##
## View(rna)も試してみる。

*。

read.csv()は、フィールドがカンマで区切られていると仮定しているが、 いくつかの国では、カンマは小数の区切り文字として使用され、 セミコロン(;)はフィールドの区切り文字として使用される。 Rでこの種のファイルを 、read.csv2()関数を使うことができる。read.csv()と全く同じ動作をするが、 小数とフィールドのセパレーターに異なるパラメーターを使用する。 別の フォーマットを使用している場合は、ユーザーが両方指定することができます。 詳しくは、read.csv()のヘルプを?read.csvと入力して確認してください。 また、read.delim()関数があり、タブ区切りのデータファイルを読み込むことができる。 重要なことは、これらの関数はすべて、 メインのread.table()関数に異なる引数を指定するためのラッパー関数であるということです。 そのため、 上のデータは、read.table()、区切りの引数を,` にしてロードすることもできた。 コードは以下の通り:

R

rna <- read.table(file = "data/rnaseq.csv",
                  sep = ",",
                  header = TRUE)

デフォルトでは read.table() の header 引数は FALSE に設定されているので、 のヘッダーを読むためには header 引数を TRUE に設定しなければならない。

データフレームとは?


データ・フレームは、ほとんどの表データ、 、統計やプロットに使われる_事実上の_データ構造である。

データフレームは手作業で作成することもできますが、最も一般的なのは、関数 read.csv()read.table() によって生成される データフレームです。

データフレームとは、 、列がすべて同じ長さのベクトルである表の形式でデータを表現したものである。 、列はベクトルであるため、各列は1種類のデータ (文字、整数、因子など)を含まなければならない。 例えば、 、数値、文字、 論理ベクトルからなるデータフレームを示す図である。

str()`という関数で :

R

str(rna)

出力

'data.frame':	32428 obs. of  19 variables:
 $ gene                                 : chr  "Asl" "Apod" "Cyp2d22" "Klk6" ...
 $ sample                               : chr  "GSM2545336" "GSM2545336" "GSM2545336" "GSM2545336" ...
 $ expression                           : int  1170 36194 4060 287 85 782 1619 288 43217 1071 ...
 $ organism                             : chr  "Mus musculus" "Mus musculus" "Mus musculus" "Mus musculus" ...
 $ age                                  : int  8 8 8 8 8 8 8 8 8 8 ...
 $ sex                                  : chr  "Female" "Female" "Female" "Female" ...
 $ infection                            : chr  "InfluenzaA" "InfluenzaA" "InfluenzaA" "InfluenzaA" ...
 $ strain                               : chr  "C57BL/6" "C57BL/6" "C57BL/6" "C57BL/6" ...
 $ time                                 : int  8 8 8 8 8 8 8 8 8 8 ...
 $ tissue                               : chr  "Cerebellum" "Cerebellum" "Cerebellum" "Cerebellum" ...
 $ mouse                                : int  14 14 14 14 14 14 14 14 14 14 ...
 $ ENTREZID                             : int  109900 11815 56448 19144 80891 20528 97827 118454 18823 14696 ...
 $ product                              : chr  "argininosuccinate lyase, transcript variant X1" "apolipoprotein D, transcript variant 3" "cytochrome P450, family 2, subfamily d, polypeptide 22, transcript variant 2" "kallikrein related-peptidase 6, transcript variant 2" ...
 $ ensembl_gene_id                      : chr  "ENSMUSG00000025533" "ENSMUSG00000022548" "ENSMUSG00000061740" "ENSMUSG00000050063" ...
 $ external_synonym                     : chr  "2510006M18Rik" NA "2D22" "Bssp" ...
 $ chromosome_name                      : chr  "5" "16" "15" "7" ...
 $ gene_biotype                         : chr  "protein_coding" "protein_coding" "protein_coding" "protein_coding" ...
 $ phenotype_description                : chr  "abnormal circulating amino acid level" "abnormal lipid homeostasis" "abnormal skin morphology" "abnormal cytokine level" ...
 $ hsapiens_homolog_associated_gene_name: chr  "ASL" "APOD" "CYP2D6" "KLK6" ...

data.frame` オブジェクトの検査


関数 head()str() が、 データフレームの内容と構造をチェックするのに便利であることは、すでに説明した。 以下は、 データの内容/構造を知るための、 非網羅的な機能のリストである。 試してみよう!

**サイズ

  • dim(rna)` - 行数を最初の 要素とし、列数を2番目の要素(オブジェクトの dimensions )とするベクトルを返す。
  • nrow(rna)` - 行の数を返す。
  • ncol(rna)` - 列数を返す。

**内容

  • head(rna)` - 最初の6行を表示する。
  • tail(rna)` - 最後の6行を表示する。

名前

  • names(rna)- 列名を返す(data.frameオブジェクトのcolnames()` と同義)。
  • rownames(rna)` - 行の名前を返す。

要約

  • str(rna)` - オブジェクトの構造と、 クラス、各カラムの長さと内容に関する情報。
  • summary(rna) - 各カラムの要約統計量。

注:これらの関数のほとんどは “ジェネリック”であり、data.frame以外の オブジェクトにも使用できます。

チャレンジだ:

str(rna)`の出力に基づいて、以下の の質問に答えられるか?

  • オブジェクト rna のクラスは何ですか?
  • このオブジェクトにはいくつの行といくつの列がありますか?
  • クラス: データ・フレーム
  • 行数:66465、列数:11:11

データフレームのインデックス化とサブセット化


rna`データフレームには行と列がある(2次元ある)。 、そこから特定のデータを抽出したい場合は、 「座標」を指定する必要がある。 行番号が最初に来て、 列番号がそれに続く。 しかし、これらの 座標を指定する方法が異なれば、異なるクラスの結果が得られることに注意されたい。

R

# データフレームの1列目の最初の要素(ベクトルとして)
rna[1, 1]
# 6列目の最初の要素(ベクトルとして)
rna[1, 6]
# データフレームの1列目の要素(ベクトルとして)
rna[, 1]
# データフレームの1列目の要素(data.フレームとして)
rna[1]
# 7列目の最初の3要素(ベクトルとして)
rna[1:3, 7]
# データフレームの3行目(data.frameとして)
rna[3, ]
# head_rna <- head(rna)
head_rna <- rna[1:6, ]
head_rna

1:1010:1`は の例で、 の増加または減少の順序で整数の数値ベクトルを作成する特別な関数である。 (sec:genvec)を参照のこと。

また、「-」記号を使ってデータフレームの特定のインデックスを除外することもできる:

R

rna[, -1] ## 最初の列を除いたデータフレーム全体
rna[-c(7:66465), ] ## head(rna)と等価

データフレームは、インデックス(前に示したように)や 、列名を直接呼び出してサブセットすることもできる:

R

rna["gene"] # Result is a data.frame
rna[, "gene"] # Result is a vector
rna[["gene"]].     # 結果はベクトル
rna$gene          # 結果はベクトル

RStudio では、オートコンプリート機能を使用して、列の完全で 正しい名前を取得できます。

チャレンジ

  1. データセット rna の 行 200 番目のデータのみを含む data.frame (rna_200) を作成する。

  2. nrow()data.frame`の行数を示していることに気づいただろうか?

  • この数字を使って、最初の rnaデータフレームの最後の行だけを取り出す。

  • tail()`を使った最後の行と比較し、 、期待に応えていることを確認する。

  • 行番号の代わりに nrow() を使って最後の行を取り出す。

  • 最後の行から新しいデータフレーム(rna_last)を作成する。

  1. rna データフレームの中央にある行を抽出するには nrow() を使用する。 この行の内容をオブジェクト rna_middle に格納する。

  2. nrow()と上記の-表記を組み合わせると、rnaデータセットの1行目から6行目までの 行だけを保持し、head(rna)`の 挙動を再現することができる。

R

## 1.
rna_200 <- rna[200, ]
## 2.
## Saving `n_rows` to improve readability and reduce duplication
n_rows <- nrow(rna)
rna_last <- rna[n_rows, ]
## 3.
rna_middle <- rna[n_rows / 2, ]
## 4.
rna_head <- rna[-(7:n_rows), ]

要因


要因はカテゴリーデータを表す。 これらは、 ラベルに関連付けられた整数として格納され、順序付けされたものであっても、順序付けされていないものであってもよい。 因子は文字ベクトルのように見える(そしてしばしば振舞う)が、 、実際にはRでは整数ベクトルとして扱われる。そのため、文字列として扱う場合は非常に 注意する必要がある。

いったん作成されたファクターは、あらかじめ定義された値のセット( 、_レベル_として知られている)しか含むことができない。 デフォルトでは、Rは常にレベルをアルファベット順( )でソートする。 例えば、2つのレベルを持つ因子があるとする:

R

セックス <- factor(c("male", "female", "female", "male", "female"))

Rは1をレベル"female"に、2をレベル "male"に割り当てる(このベクトルの最初の要素 が"male"であるにもかかわらず、fmの前に来るため)。 これは、 levels() という関数を使うことで見ることができ、nlevels() を使えばレベル数を知ることができる:

R

levels(sex)

エラー

Error in eval(expr, envir, enclos): object 'sex' not found

R

nlevels(sex)

エラー

Error in eval(expr, envir, enclos): object 'sex' not found

要因の順番が重要でない場合もあるが、 、意味がある(例えば、“low”、 “medium”、“high”)、視覚化が向上する、または特定のタイプの分析で必要である( )ため、順番を指定したい場合もある。 ここで、 sexベクトルでレベルを並べ替える一つの方法は次のようになる:

R

sex ## current order

エラー

Error in eval(expr, envir, enclos): object 'sex' not found

R

sex <- factor(sex, levels = c("male", "female"))

エラー

Error in eval(expr, envir, enclos): object 'sex' not found

R

sex ## after re-ordering

エラー

Error in eval(expr, envir, enclos): object 'sex' not found

Rの記憶では、これらの因子は整数(1, 2, 3)、 で表現されるが、因子は自己 を記述するため、整数よりも情報量が多い。"女性""男性"12よりも説明的である。 どちらが “男性”ですか?
の整数データだけではわからないだろう。 一方、ファクターはこの情報を内蔵している。 特に、レベルが多い場合(例のデータセットの 遺伝子バイオタイプのような)に便利である。

データが因子として格納されているとき、各因子レベルによって表現されるオブザベーションの数 を素早く見るために、 plot() 関数を使うことができます。 データ中の男性 、女性の数を見てみよう。

R

プロット()

エラー

Error in プロット(性): could not find function "プロット"

文字への変換

因数を文字ベクトルに変換する必要がある場合は、 as.character(x).

R

as.character()

エラー

Error in eval(expr, envir, enclos): object '性' not found

要因の名称変更

これらのファクターの名前を変えたい場合は、 :

R

levels(sex)

エラー

Error in eval(expr, envir, enclos): object 'sex' not found

R

levels(sex) <- c("M", "F")

エラー

Error: object 'sex' not found

R

sex

エラー

Error in eval(expr, envir, enclos): object 'sex' not found

R

plot(sex)

エラー

Error in eval(expr, envir, enclos): object 'sex' not found

チャレンジだ:

  • F “と”M “の名前をそれぞれ”Female “と”Male “に変更する。

R

levels(sex)

エラー

Error in eval(expr, envir, enclos): object 'sex' not found

R

levels(sex) <- c("Male", "Female")

エラー

Error: object 'sex' not found

チャレンジだ:

read.csv()を使ってデータフレームを作成する方法を見てきましたが、data.frame()関数を使って手作業で作成することもできます。 この手作りのdata.frame`にはいくつか間違いがある。 、それを見つけて修正することはできますか? 実験することをためらってはいけない!

R

animal_data <- data.frame(
       animal = c(dog, cat, sea cucumber, sea nurchin),
       feel = c("furry", "squishy", "spiny"),
       weight = c(45, 8 1.1, 0.8))
  • 動物の名前の周りに引用符がない
  • “feel”欄に1つ記入がない(おそらく毛皮の動物の1つ)。
  • 体重欄のコンマが1つ足りない

チャレンジだ:

次の の例で、各列のクラスを予測できますか?

str(country_climate)`を使って推測をチェックする:

  • 期待通りですか? なぜですか? なぜだ?

  • データフレームを作成する際に、最後の 変数の後に stringsAsFactors = TRUE を追加してもう一度試してみてください。 今、何が起きているのか? stringsAsFactorsは、read.csv()`を使ってテキストベースの のスプレッドシートをRに読み込むときにも設定できる。

R

country_climate <- data.frame(
       country = c("Canada", "Panama", "South Africa", "Australia"),
       climate = c("cold", "hot", "temperate", "hot/temperate")、
       temperature = c(10, 30, 18, "15"),
       northern_hemisphere = c(TRUE, TRUE, FALSE, "FALSE"),
       has_kangaroo = c(FALSE, FALSE, FALSE, 1)
)

R

country_climate <- data.frame(
       country = c("Canada", "Panama", "South Africa", "Australia"),
       climate = c("cold", "hot", "temperate", "hot/temperate"),
       temperature = c(10, 30, 18, "15"),
       northern_hemisphere = c(TRUE, TRUE, FALSE, "FALSE"),
       has_kangaroo = c(FALSE, FALSE, FALSE, 1)
       )
str(country_climate)

出力

'data.frame':	4 obs. of  5 variables:
 $ country            : chr  "Canada" "Panama" "South Africa" "Australia"
 $ climate            : chr  "cold" "hot" "temperate" "hot/temperate"
 $ temperature        : chr  "10" "30" "18" "15"
 $ northern_hemisphere: chr  "TRUE" "TRUE" "FALSE" "FALSE"
 $ has_kangaroo       : num  0 0 0 1

データ型の自動変換は、時に恵みであり、時に 迷惑である。 その存在を認識し、ルールを学び、Rでインポートするデータ がデータフレーム内で正しい型であることを再確認すること。 そうでない場合は、 データ入力中に生じたかもしれないミス(例えば、数字しか入っていないはずの列に文字が入っている)を検出するために、 を活用する。

詳しくはRStudio チュートリアルをご覧ください。

マトリックス


先に進む前に、データ・フレームについて学んだので、 パッケージのインストールを復習し、新しいデータ型、すなわち matrix について学んでみよう。 data.frameのように、行列は行と 列の2つの次元を持つ。 しかし大きな違いは、行列のすべてのセルは 同じ型でなければならないということである:numericcharacterlogical、… その点で、行列は data.frame よりも vector に近い。

行列のデフォルトコンストラクタは matrix である。 行列を構成するための の値のベクトルと、行および/または の列数1を取る。 下の図( )のように、値は列に沿ってソートされる。

R

m <- matrix(1:9, ncol = 3, nrow = 3)
m

出力

     [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

チャレンジだ:

installed.packages()という関数を使って、 あなたのコンピューターに現在インストールされているすべてのパッケージの情報を含む文字`行列 を作成します。 探検してみよう。

R

##
ip <- installed.packages()
head(ip)
## View(ip)
## パッケージの数
nrow(ip)
## インストールされている全てのパッケージの名前
rownames(ip)
## 各パッケージに関する情報の種類
colnames(ip)

テストデータとして、大規模なランダムデータ行列を作成することはしばしば有用である。 以下の練習問題は、平均0、標準偏差 1の正規分布から無作為に データを抽出して、そのような行列を作成するものです。これは rnorm() 関数で行うことができます。

チャレンジだ:

正規分布データ (平均0、標準偏差1)の次元1000×3の行列を作る。

R

set.seed(123)
m <- matrix(rnorm(3000), ncol = 3)
dim(m)

出力

[1] 1000    3

R

head(m)

出力

            [,1]        [,2]       [,3]
[1,] -0.56047565 -0.99579872 -0.5116037
[2,] -0.23017749 -1.03995504  0.2369379
[3,]  1.55870831 -0.01798024 -0.5415892
[4,]  0.07050839 -0.13217513  1.2192276
[5,]  0.12928774 -2.54934277  0.1741359
[6,]  1.71506499  1.04057346 -0.6152683

日付の書式設定


新人(そしてベテラン!)が抱える最も一般的な問題の1つである。 Rユーザーは、 、日付と時刻の情報を、 適切で分析中に使用可能な変数に変換している。

表計算ソフトの日付に関する注意

スプレッドシートの日付は通常、1つの列に格納される。 これが日付を記録する最も自然な方法のように思えるが、実際には ベストプラクティスではない。 スプレッドシート・アプリケーションは、 一見正しい方法で日付を表示する(人間の観察者には)。しかし、実際に どのように日付を処理し、保存するかには問題があるかもしれない。 YEAR、MONTH、DAYを別々のカラムに、または 、YEARとDAY-OF-YEARを別々のカラムに保存した方が、 より安全な場合が多い。

LibreOffice、Microsoft Excel、OpenOffice、 Gnumericなどの表計算プログラム。 は、 日付のエンコード方法が異なる(そしてしばしば互換性がない)(同じプログラムであっても、バージョンやオペレーティング システム間で)。 さらに、エクセルは日付でないものを 日付に変える (@Zeeberg:2004)ことができる。例えば、MAR1、DEC1、 OCT4のような名前や識別子である。 そのため、全体的に日付フォーマットを避けているのであれば、 、こうした問題を特定しやすくなる。

Data CarpentryレッスンのDates as data セクションでは、スプレッドシートを使った日付の落とし穴について、さらなる洞察 を提供しています。

lubridate** パッケージのymd()関数を使用します (**tidyverse に属します。詳しくは こちら)。 . **lubridate**は**tidyverse**のインストールの一部として 。 tidyverse (library(tidyverse)) をロードすると、コアパッケージ (ほとんどのデータ分析で使用される パッケージ) がロードされます。 lubridate しかし、コアTidyverseには属さないので、 library(lubridate)で明示的にロードする必要があります。

必要なパッケージをロードすることから始める:

R

library("lubridate")

ymd()は年、月、日を表すベクトルを受け取り、Dateベクトルに変換する。 DateはRが 、日付であると認識するデータのクラスであり、そのように操作することができる。 関数が必要とする引数は柔軟であるが、ベストプラクティスとしては、“YYYY-MM-DD”としてフォーマットされた文字 ベクトルである。

日付オブジェクトを作成し、構造を調べてみよう:

R

my_date <- ymd("2015-01-01")
str(my_date)

出力

 Date[1:1], format: "2015-01-01"

では、年、月、日を別々に貼り付けてみよう:

R

# sep は各コンポーネントを区切るために使う文字を示す
my_date <- ymd(paste("2015", "1", "1", sep = "-"))
str(my_date)

出力

 Date[1:1], format: "2015-01-01"

それでは、典型的な日付操作 のパイプラインに慣れておこう。 以下の小さなデータには、異なる yearmonthday 列に日付が格納されている。

R

x <- data.frame(year = c(1996, 1992, 1987, 1986, 2000, 1990, 2002, 1994, 1997, 1985),
                month = c(2, 3, 10, 1, 8, 3, 4, 5, 5),
                day = c(24, 8, 1, 5, 8, 17, 13, 10, 11, 24),
                value = c(4, 5, 1, 9, 3, 8, 10, 2, 6, 7))

エラー

Error in data.frame(year = c(1996, 1992, 1987, 1986, 2000, 1990, 2002, : arguments imply differing number of rows: 10, 9

R

x

エラー

Error in eval(expr, envir, enclos): object 'x' not found

次に、この関数を x データセットに適用する。 まず、paste() を使って、xyearmonthday 列から の文字ベクトルを作る:

R

paste(x$year, x$month, x$day, sep = "-")

エラー

Error in eval(expr, envir, enclos): object 'x' not found

この文字ベクトルは ymd() の引数として使うことができる:

R

ymd(paste(x$year, x$month, x$day, sep = "-"))

エラー

Error in eval(expr, envir, enclos): object 'x' not found

出来上がった Date ベクトルは xdate という新しいカラムとして追加することができる:

R

x$date <- ymd(paste(x$year, x$month, x$day, sep = "-"))

エラー

Error in eval(expr, envir, enclos): object 'x' not found

R

str(x) # '日付'をクラスとする新しいカラムに注目。

エラー

Error in eval(expr, envir, enclos): object 'x' not found

すべてが正しく機能していることを確認しよう。 新しいカラムを検査する一つの方法は、summary()を使うことである:

R

summary(x$date)

エラー

Error in eval(expr, envir, enclos): object 'x' not found

ymd()は、年、月、日を の順番で持つことを期待している。 例えば、日、月、年があれば、dmy()` が必要になる。

R

dmy(paste(x$day, x$month, x$year, sep = "-"))

エラー

Error in eval(expr, envir, enclos): object 'x' not found

lubdridate`は、あらゆる日付のバリエーションに対応する多くの関数を持っている。

Rオブジェクトの概要


これまで、次元数( )、格納できるデータの種類( )が単一か複数かによって異なる、いくつかのタイプのRオブジェクトを見てきた:

  • vector`:1次元(長さがある)、1種類のデータ。
  • マトリックス`:2次元、単一データ型。
  • data.frame`:2次元、1列1型。

リスト


まだ見ていないが、知っておくと便利なデータ型がリストだ。 、先ほどのまとめから続く:

  • list: 1つの次元で、各項目は異なるデータ 型にすることができる。

以下では、数値、文字、 行列、データフレーム、別のリストのベクトルを含むリストを作ってみよう:

R

l <- list(1:10, ## numeric
          letters, ## character
          installed.packages(), ## a matrix
          cars, ## a data.frame
          list(1, 2, 3)) ## a list
length(l)

出力

[1] 5

R

str(l)

出力

List of 5
 $ : int [1:10] 1 2 3 4 5 6 7 8 9 10
 $ : chr [1:26] "a" "b" "c" "d" ...
 $ : chr [1:187, 1:16] "askpass" "assertthat" "backports" "base64enc" ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:187] "askpass" "assertthat" "backports" "base64enc" ...
  .. ..$ : chr [1:16] "Package" "LibPath" "Version" "Priority" ...
 $ :'data.frame':	50 obs. of  2 variables:
  ..$ speed: num [1:50] 4 4 7 7 8 9 10 10 10 11 ...
  ..$ dist : num [1:50] 2 10 4 22 16 10 18 26 34 17 ...
 $ :List of 3
  ..$ : num 1
  ..$ : num 2
  ..$ : num 3

リストのサブセットは [] を使って新しいサブリストをサブセットするか、[]] を使ってそのリストの単一要素を取り出す( リストに名前がついている場合は、インデックスか名前を使う)。

R

l[[1]]##

出力

 [1]  1  2  3  4  5  6  7  8  9 10

R

l[1:2] ## 長さ 2 のリスト

出力

[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

[[2]]
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[20] "t" "u" "v" "w" "x" "y" "z"

R

l[1] ## 長さ 1 のリスト

出力

[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

表形式データのエクスポートと保存


read.table ファミリーの関数を使って、テキストベースのスプレッドシートをRに読み込む方法を見てきた。 data.frameを テキストベースのスプレッドシートにエクスポートするには、 関数のwrite.tableセット(write.csv,write.delim, ...)を使用します。 これらはすべて、 エクスポートする変数と、エクスポートするファイルを指定する。 例えば、rnaのデータをdata_outputディレクトリのmy_rna.csv` ファイルにエクスポートするには、次のように実行する:

R

write.csv(rna, file = "data_output/my_rna.csv")

この新しいcsvファイルは、 、Rに精通していない他の共同研究者と共有することができます。data.frameのフィールドの一部(例えば、“product”列を参照)にカンマがあるにもかかわらず、Rはデフォルトで 、各フィールドを引用符で囲みます。したがって、 、列の区切り文字としてカンマを使用しているにもかかわらず、 、Rに正しく読み込むことができます。

まとめ

  • Rでの表形式データ

  1. 行数か列数のどちらかだけで十分で、もう一方は値の長さから推測できる。 値と行/列の数が合わない場合に何が起こるか試してみてください。↩︎