R Language
データフレーム
サーチ…
構文
data.frame(...、row.names = NULL、check.rows = FALSE、check.names = TRUE、stringsAsFactors = default.stringsAsFactors())
as.data.frame(x、row.names = NULL、オプション= FALSE、...)#ジェネリック関数
as.data.frame(x、...、stringsAsFactors = default.stringsAsFactors())クラス '文字'の#S3メソッド
クラス '行列'の#S3メソッドは、次のようになります。asStatusAsFactors = default.stringsAsFactors()
is.data.frame(x)
空のdata.frameを作成する
data.frameは特別な種類のリストで、 長方形です。リストの各要素(列)は同じ長さを持ち、各行には「行名」があります。各列には独自のクラスがありますが、ある列のクラスは別の列のクラスとは異なる場合があります(行列とは異なり、すべての要素が同じクラスでなければなりません)。
原則として、data.frameには行はなく、列はありません。
> structure(list(character()), class = "data.frame")
NULL
<0 rows> (or 0-length row.names)
しかしこれは珍しいことです。 data.frameが多くの列と多数の行を持つのがより一般的です。以下は3行2列のdata.frameです( a
は数値クラス、 b
は文字クラス)。
> structure(list(a = 1:3, b = letters[1:3]), class = "data.frame")
[1] a b
<0 rows> (or 0-length row.names)
data.frameが印刷するためには、いくつかの行名を指定する必要があります。ここでは、1:3の数字だけを使用します。
> structure(list(a = 1:3, b = letters[1:3]), class = "data.frame", row.names = 1:3)
a b
1 1 a
2 2 b
3 3 c
3行2列のdata.frameがあることは明らかです。 nrow()
、 ncol()
、およびdim()
を使ってこれをチェックすることができます:
> x <- structure(list(a = numeric(3), b = character(3)), class = "data.frame", row.names = 1:3)
> nrow(x)
[1] 3
> ncol(x)
[1] 2
> dim(x)
[1] 3 2
Rは、data.frameの作成に使用できる2つの他の関数( structure()
他に)を提供します。最初は直感的にdata.frame()
と呼ばれます。指定した列名が有効であり、リスト要素がすべて同じ長さであり、自動的に生成された行名をいくつか提供するかどうかがチェックされます。これは、 data.frame()
出力がいつもあなたが期待しているものと同じになることを意味します:
> str(data.frame("a a a" = numeric(3), "b-b-b" = character(3)))
'data.frame': 3 obs. of 2 variables:
$ a.a.a: num 0 0 0
$ b.b.b: Factor w/ 1 level "": 1 1 1
他の関数はas.data.frame()
と呼ばれます。これは、 data.frame()
介してdata.frame()
実行することによって、data.frameではないオブジェクトを強制的にdata.frameに強制するために使用できます。例として、行列を考えてみましょう。
> m <- matrix(letters[1:9], nrow = 3)
> m
[,1] [,2] [,3]
[1,] "a" "d" "g"
[2,] "b" "e" "h"
[3,] "c" "f" "i"
そして結果:
> as.data.frame(m)
V1 V2 V3
1 a d g
2 b e h
3 c f i
> str(as.data.frame(m))
'data.frame': 3 obs. of 3 variables:
$ V1: Factor w/ 3 levels "a","b","c": 1 2 3
$ V2: Factor w/ 3 levels "d","e","f": 1 2 3
$ V3: Factor w/ 3 levels "g","h","i": 1 2 3
データフレームから行と列をサブセット化する
行と列にアクセスするための構文: [
、 [[
、 $
このトピックでは、データフレームの特定の行と列にアクセスするための最も一般的な構文について説明します。これらは
- 単一のかっこを持つ
matrix
ように、data[rows, columns]
- 行番号と列番号を使用する
- 列(および行)名の使用
-
list
:- データフレームを取得するための単一の括弧の
data[columns]
- 二重括弧
data[[one_column]]
を使ってベクトルを得る
- データフレームを取得するための単一の括弧の
- 1列の
data$column_name
$
を指定すると
私たちは組み込みのmtcars
データフレームをmtcars
て説明します。
行列のように: data[rows, columns]
数値インデックスを使用する
組み込みのデータフレームmtcars
を使用して、カンマを含む[]
を使用して行と列を抽出できます。コンマの前のインデックスは行です:
# get the first row
mtcars[1, ]
# get the first five rows
mtcars[1:5, ]
同様に、カンマが列の後に:
# get the first column
mtcars[, 1]
# get the first, third and fifth columns:
mtcars[, c(1, 3, 5)]
上記のように、行または列のいずれかを空白のままにすると、すべてが選択されます。 mtcars[1, ]
は、 すべての列を含む最初の行を示します。
列(および行)名
ここまでは、行列の行と列にどのようにアクセスするかと同じです。 data.frame
では、ほとんどの場合、列インデックスに列名を使用することをおdata.frame
ます。これは、 numeric
代わりに列番号を持つcharacter
を列番号とともに使用することによって実行されます。
# get the mpg column
mtcars[, "mpg"]
# get the mpg, cyl, and disp columns
mtcars[, c("mpg", "cyl", "disp")]
あまり一般的ではありませんが、行名も使用できます。
mtcars["Mazda Rx4", ]
行と列をまとめて
行と列の引数は一緒に使用できます:
# first four rows of the mpg column
mtcars[1:4, "mpg"]
# 2nd and 5th row of the mpg, cyl, and disp columns
mtcars[c(2, 5), c("mpg", "cyl", "disp")]
ディメンションに関する警告:
これらのメソッドを使用する場合、複数の列を抽出すると、データフレームが戻されます。ただし、 単一の列を抽出すると、デフォルトオプションの下にデータフレームではなくベクトルが得られます。
## multiple columns returns a data frame
class(mtcars[, c("mpg", "cyl")])
# [1] "data.frame"
## single column returns a vector
class(mtcars[, "mpg"])
# [1] "numeric"
これには2つの方法があります。 1つはデータフレームをリスト(下記参照)として扱い、もう1つはdrop = FALSE
引数を追加することです。これは、Rに「未使用のディメンションを削除しない」ように指示します。
class(mtcars[, "mpg", drop = FALSE])
# [1] "data.frame"
行列は同じ方法で動作することに注意してください。デフォルトでは、単一の列または行がベクトルになりますが、 drop = FALSE
を指定すると、1列または1行の行列として保持できdrop = FALSE
。
リストのように
データフレームは基本的にlist
sです。つまり、列ベクトルのリスト(すべてが同じ長さでなければなりません)です。リストは、単一の括弧[
サブリストの場合は二重括弧[[
単一の要素の場合[
を使用してサブセットにすることができます。
単一のかっこでdata[columns]
単一の角かっこを使用し、カンマを使用しない場合、データフレームは列のリストなので、列が戻されます。
mtcars["mpg"]
mtcars[c("mpg", "cyl", "disp")]
my_columns <- c("mpg", "cyl", "hp")
mtcars[my_columns]
リストのような単一の括弧と行列のような単一の括弧 data[columns]
とdata[, columns]
の違いは、 data.frame
をlist
(括弧内のカンマなし)として扱うとき、返されるオブジェクトはdata.frame
ます。コンマを使用してdata.frame
matrix
ように扱う場合、単一の列を選択するとベクトルが返されますが、複数の列を選択するとdata.frame
が返されます。
## When selecting a single column
## like a list will return a data frame
class(mtcars["mpg"])
# [1] "data.frame"
## like a matrix will return a vector
class(mtcars[, "mpg"])
# [1] "numeric"
二重括弧で囲まれたdata[[one_column]]
data.frame
をlist
として扱うときに、単一の列をベクトルとして抽出するには、二重大括弧[[
。これは、一度に1つの列に対してのみ機能します。
# extract a single column by name as a vector
mtcars[["mpg"]]
# extract a single column by name as a data frame (as above)
mtcars["mpg"]
$
を使用した列へのアクセス
引用符で囲まれた列名を使用せずに、魔法のショートカット$
を使用して単一の列を抽出することができます:
# get the column "mpg"
mtcars$mpg
$
アクセスされる列は常にデータフレームではなくベクトルです。
列にアクセスするための$
欠点
$
は便利なショートカットです。特にこの場合は列名を自動完成する環境(RStudioなど)で作業している場合に便利です。 しかし、 $
は欠点もあります:引用符の必要性を避けるために非標準の評価を使用します。つまり、列名が変数に格納されていると機能しません 。
my_column <- "mpg"
# the below will not work
mtcars$my_column
# but these will work
mtcars[, my_column] # vector
mtcars[my_column] # one-column data frame
mtcars[[my_column]] # vector
これらの懸念のため、 $
は、列名が一定の場合、 対話式 Rセッションで最もよく使用されます。たとえば列名の異なるさまざまなデータセットで使用される一般化可能な関数を書く場合など、 プログラムでの使用の場合は、 $
を避ける必要があります。
また、デフォルト動作では、再帰オブジェクト(環境を除く)から$
# give you the values of "mpg" column
# as "mtcars" has only one column having name starting with "m"
mtcars$m
# will give you "NULL"
# as "mtcars" has more than one columns having name starting with "d"
mtcars$d
高度なインデックス作成:負のインデックスと論理インデックス
インデックスに数値を使用するオプションがある場合は、負の数を使用して特定のインデックスを省略するか、ブール(論理)ベクトルを使用して、保持するアイテムを正確に示すこともできます。
負のインデックスは要素を省略します
mtcars[1, ] # first row
mtcars[ -1, ] # everything but the first row
mtcars[-(1:10), ] # everything except the first 10 rows
論理ベクトルは、保持する特定の要素を示します
<
などの条件を使用して論理ベクトルを生成し、条件を満たす行のみを抽出することができます。
# logical vector indicating TRUE when a row has mpg less than 15
# FALSE when a row has mpg >= 15
test <- mtcars$mpg < 15
# extract these rows from the data frame
mtcars[test, ]
中間変数を保存するステップを省略することもできます
# extract all columns for rows where the value of cyl is 4.
mtcars[mtcars$cyl == 4, ]
# extract the cyl, mpg, and hp columns where the value of cyl is 4
mtcars[mtcars$cyl == 4, c("cyl", "mpg", "hp")]
data.framesを操作する便利な関数
data.frames
を操作するいくつかの便利な関数は、 subset()
、 transform()
、 with()
およびwithin()
です。
サブセット
subset()
関数を使用すると、 data.frame
をより便利にサブセット化することができます(サブセットは他のクラスでも機能します)。
subset(mtcars, subset = cyl == 6, select = c("mpg", "hp"))
mpg hp
Mazda RX4 21.0 110
Mazda RX4 Wag 21.0 110
Hornet 4 Drive 21.4 110
Valiant 18.1 105
Merc 280 19.2 123
Merc 280C 17.8 123
Ferrari Dino 19.7 175
上記のコードでは、 cyl == 6
の行とmpg
とhp
列のみを求めています。 []
使って次のコードで同じ結果を得ることができます:
mtcars[mtcars$cyl == 6, c("mpg", "hp")]
変換する
transform()
関数は、 data.frame
内の列を変更する便利な関数data.frame
。たとえば、次のコードは、名前の別の列追加mpg2
の結果とmpg^2
のmtcars
data.frame
:
mtcars <- transform(mtcars, mpg2 = mpg^2)
と一緒に
with()
とwithin()
両方を使用するwith()
、 data.frame
環境内の式を評価することができ、よりdata.frame
された構文が可能になり、 $
または[]
使用を節約できます。
たとえば、 airquality
data.frame
複数の列を作成、変更、または削除する場合は、次のようにします。
aq <- within(airquality, {
lOzone <- log(Ozone) # creates new column
Month <- factor(month.abb[Month]) # changes Month Column
cTemp <- round((Temp - 32) * 5/9, 1) # creates new column
S.cT <- Solar.R / cTemp # creates new column
rm(Day, Temp) # removes columns
})
前書き
データフレームは、分析で最も多く使用するデータ構造です。データフレームは、異なるクラスの同じ長さのベクトルを格納する特別な種類のリストです。 data.frame
関数を使用してデータフレームを作成します。以下の例は、数字と文字のベクトルをデータフレームに組み合わせることによってこれを示しています。これは:
演算子を使用して、1から3までのすべての整数を含むベクトルを作成します。
df1 <- data.frame(x = 1:3, y = c("a", "b", "c"))
df1
## x y
## 1 1 a
## 2 2 b
## 3 3 c
class(df1)
## [1] "data.frame"
データフレームオブジェクトは引用符では印刷されないため、列のクラスは必ずしも明確ではありません。
df2 <- data.frame(x = c("1", "2", "3"), y = c("a", "b", "c"))
df2
## x y
## 1 1 a
## 2 2 b
## 3 3 c
さらなる研究がなければ、 df1
およびdf2
の「x」列はdf2
できない。 str
関数は、クラスよりも詳細なオブジェクトを記述するために使用できます。
str(df1)
## 'data.frame': 3 obs. of 2 variables:
## $ x: int 1 2 3
## $ y: Factor w/ 3 levels "a","b","c": 1 2 3
str(df2)
## 'data.frame': 3 obs. of 2 variables:
## $ x: Factor w/ 3 levels "1","2","3": 1 2 3
## $ y: Factor w/ 3 levels "a","b","c": 1 2 3
ここでは、 data.frame
あり、2つの変数 "x"と "y"の3つの観測df1
があることがdf1
ます。次に、 "x"はデータ型整数(このクラスでは重要ではありませんが、目的のためには数字のように動作します)と "y"は3つのレベル(別のデータクラスについて議論していません)です。 デフォルトでは、データフレームは文字を要素に強制することに注意することが重要です。デフォルトの動作はstringsAsFactors
パラメータで変更できます。
df3 <- data.frame(x = 1:3, y = c("a", "b", "c"), stringsAsFactors = FALSE)
str(df3)
## 'data.frame': 3 obs. of 2 variables:
## $ x: int 1 2 3
## $ y: chr "a" "b" "c"
今、「y」列は文字です。上述したように、データフレームの各「列」は同じ長さでなければならない。長さの異なるベクトルからdata.frameを作成しようとすると、エラーが発生します。 (結果のエラーを表示するには、 data.frame(x = 1:3, y = 1:4)
を実行してください。
データフレームのテストケースとして、既定ではRによっていくつかのデータが提供されます。それらの1つは虹彩で、次のようにロードされます:
mydataframe <- iris
str(mydataframe)
do.callを使用してリストに格納されたデータを単一のデータフレームに変換する
データをリストに格納していて、このリストをデータフレームに変換したい場合、 do.call
関数はこれを実現する簡単な方法です。ただし、意図しない値のリサイクルを防ぐためには、すべてのリスト要素の長さが同じであることが重要です。
dataList <- list(1:3,4:6,7:9)
dataList
# [[1]]
# [1] 1 2 3
#
# [[2]]
# [1] 4 5 6
#
# [[3]]
# [1] 7 8 9
dataframe <- data.frame(do.call(rbind, dataList))
dataframe
# X1 X2 X3
# 1 1 2 3
# 2 4 5 6
# 3 7 8 9
リストがデータフレーム自体で構成されている場合にも機能します。
dataframeList <- list(data.frame(a = 1:2, b = 1:2, c = 1:2),
data.frame(a = 3:4, b = 3:4, c = 3:4))
dataframeList
# [[1]]
# a b c
# 1 1 1 1
# 2 2 2 2
# [[2]]
# a b c
# 1 3 3 3
# 2 4 4 4
dataframe <- do.call(rbind, dataframeList)
dataframe
# a b c
# 1 1 1 1
# 2 2 2 2
# 3 3 3 3
# 4 4 4 4
data.frameのすべての列を文字クラスに変換する
一般的な作業は、データフレームをRDBMSに送信する場合や、入力データ間でレベルが異なる可能性のある要素を含むデータを結合する場合など、操作を容易にするためにdata.frameのすべての列を文字クラスに変換することです。 。
データフレームを作成するほとんどすべての入力メソッドには、 FALSE
に設定できるoptions stringsAsFactors
オプションがありFALSE
。
データがすでに作成されている場合、因子列は以下のように文字列に変換できます。
bob <- data.frame(jobs = c("scientist", "analyst"),
pay = c(160000, 100000), age = c(30, 25))
str(bob)
'data.frame': 2 obs. of 3 variables: $ jobs: Factor w/ 2 levels "analyst","scientist": 2 1 $ pay : num 160000 100000 $ age : num 30 25
# Convert *all columns* to character
bob[] <- lapply(bob, as.character)
str(bob)
'data.frame': 2 obs. of 3 variables: $ jobs: chr "scientist" "analyst" $ pay : chr "160000" "1e+05" $ age : chr "30" "25"
# Convert only factor columns to character
bob[] <- lapply(bob, function(x) {
if is.factor(x) x <- as.character(x)
return(x)
})
列値による行のサブセット化
ビルトイン関数は、条件を満たすcolumns
を含むrows
をサブセット化できます。
df <- data.frame(item = c(1:10),
price_Elasticity = c(-0.57667, 0.03205, -0.04904, 0.10342, 0.04029,
0.0742, 0.1669, 0.0313, 0.22204, 0.06158),
total_Margin = c(-145062, 98671, 20576, -56382, 207623, 43463, 1235,
34521, 146553, -74516))
price_Elasticity > 0
rows
を検索するには:
df[df$price_Elasticity > 0, ]
item price_Elasticity total_Margin
2 2 0.03205 98671
4 4 0.10342 -56382
5 5 0.04029 207623
6 6 0.07420 43463
7 7 0.16690 1235
8 8 0.03130 34521
9 9 0.22204 146553
10 10 0.06158 -74516
サブセットはprice_Elasticity > 0
、 total_Margin > 0
:
df[df$price_Elasticity > 0 & df$total_Margin > 0, ]
item price_Elasticity total_Margin
2 2 0.03205 98671
5 5 0.04029 207623
6 6 0.07420 43463
7 7 0.16690 1235
8 8 0.03130 34521
9 9 0.22204 146553