データから始める
最終更新日: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
以外の
オブジェクトにも使用できます。
- クラス: データ・フレーム
- 行数: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:10と
10:1`は の例で、
の増加または減少の順序で整数の数値ベクトルを作成する特別な関数である。
詳しくは@ref(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 では、オートコンプリート機能を使用して、列の完全で 正しい名前を取得できます。
チャレンジ
データセット
rna
の 行 200 番目のデータのみを含むdata.frame
(rna_200
) を作成する。nrow()
が
data.frame`の行数を示していることに気づいただろうか?
この数字を使って、最初の
rna
データフレームの最後の行だけを取り出す。tail()`を使った最後の行と比較し、 、期待に応えていることを確認する。
行番号の代わりに
nrow()
を使って最後の行を取り出す。最後の行から新しいデータフレーム(
rna_last
)を作成する。
rna
データフレームの中央にある行を抽出するにはnrow()
を使用する。 この行の内容をオブジェクトrna_middle
に格納する。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"
であるにもかかわらず、f
がm
の前に来るため)。
これは、 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)、 で表現されるが、因子は自己
を記述するため、整数よりも情報量が多い。"女性"
、"男性"
は1
、
2
よりも説明的である。 どちらが “男性”ですか?
の整数データだけではわからないだろう。
一方、ファクターはこの情報を内蔵している。
特に、レベルが多い場合(例のデータセットの
遺伝子バイオタイプのような)に便利である。
データが因子として格納されているとき、各因子レベルによって表現されるオブザベーションの数
を素早く見るために、 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
R
levels(sex)
エラー
Error in eval(expr, envir, enclos): object 'sex' not found
R
levels(sex) <- c("Male", "Female")
エラー
Error: object 'sex' not found
- 動物の名前の周りに引用符がない
- “feel”欄に1つ記入がない(おそらく毛皮の動物の1つ)。
- 体重欄のコンマが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つの次元を持つ。 しかし大きな違いは、
行列のすべてのセルは 同じ型でなければならないということである:numeric
、character
、logical
、…
その点で、行列は 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
R
##
ip <- installed.packages()
head(ip)
## View(ip)
## パッケージの数
nrow(ip)
## インストールされている全てのパッケージの名前
rownames(ip)
## 各パッケージに関する情報の種類
colnames(ip)
テストデータとして、大規模なランダムデータ行列を作成することはしばしば有用である。
以下の練習問題は、平均0、標準偏差 1の正規分布から無作為に
データを抽出して、そのような行列を作成するものです。これは
rnorm()
関数で行うことができます。
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"
それでは、典型的な日付操作 のパイプラインに慣れておこう。
以下の小さなデータには、異なる year
、
month
、day
列に日付が格納されている。
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()
を使って、x
の
year
、month
、day
列から
の文字ベクトルを作る:
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
ベクトルは x
に
date
という新しいカラムとして追加することができる:
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に正しく読み込むことができます。
行数か列数のどちらかだけで十分で、もう一方は値の長さから推測できる。 値と行/列の数が合わない場合に何が起こるか試してみてください。↩︎