サーチ…


構文

  • 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.framelist (括弧内のカンマなし)として扱うとき、返されるオブジェクトは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.framelistとして扱うときに、単一の列をベクトルとして抽出するには、二重大括弧[[ 。これは、一度に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の行とmpghp列のみを求めています。 []使って次のコードで同じ結果を得ることができます:

mtcars[mtcars$cyl == 6, c("mpg", "hp")]

変換する

transform()関数は、 data.frame内の列を変更する便利な関数data.frame 。たとえば、次のコードは、名前の別の列追加mpg2の結果とmpg^2mtcars 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 > 0total_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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow