サーチ…


リストへの簡単な紹介

一般に、ユーザーとして対話するオブジェクトの大部分はベクトルになりがちです。例えば、数値ベクトル、論理ベクトル。これらのオブジェクトは、1つのタイプの変数のみを取ることができます(数値ベクトルは内部に数値を持つことができます)。

リストには任意の型変数を格納することができ、必要な任意の型の変数を格納できる汎用オブジェクトにすることができます。

リストの初期化の例

exampleList1 <- list('a', 'b')
exampleList2 <- list(1, 2)
exampleList3 <- list('a', 1, 2)

リストに定義されているデータを理解するために、str関数を使用することができます。

str(exampleList1)
str(exampleList2)
str(exampleList3)

リストのサブセットは、リストのスライスを抽出すること、すなわち、元のリスト内の要素のサブセットを含むリストを取得すること、および単一の要素を抽出することを区別する。 [ベクトルに共通に使用される演算子を使用すると、新しいリストが生成されます。

# Returns List
exampleList3[1]
exampleList3[1:2]

単一の要素を得るには、 [[

# Returns Character
exampleList3[[1]]

リスト項目の名前は次のとおりです。

exampleList4 <- list(
    num = 1:3,
    numeric = 0.5,
    char = c('a', 'b')
)

名前付きリストのエントリは、インデックスではなく名前でアクセスできます。

exampleList4[['char']]

代わりに、 $演算子を使用して名前付き要素にアクセスすることもできます。

exampleList4$num

これは、タイプする方が速く、読みやすくなるという利点がありますが、潜在的な落とし穴に気づくことが重要です。 $演算子は部分一致を使用して一致するリスト要素を識別し、予期しない結果を生成する可能性があります。

exampleList5 <- exampleList4[2:3]

exampleList4$num
# c(1, 2, 3)

exampleList5$num
# 0.5

exampleList5[['num']]
# NULL

リストは、さまざまな長さのオブジェクトやさまざまなクラスのオブジェクトを格納できるため、特に便利です。

## Numeric vector
exampleVector1 <- c(12, 13, 14)
## Character vector
exampleVector2 <- c("a", "b", "c", "d", "e", "f")
## Matrix
exampleMatrix1 <- matrix(rnorm(4), ncol = 2, nrow = 2)
## List
exampleList3 <- list('a', 1, 2)

exampleList6 <- list(
    num = exampleVector1, 
    char = exampleVector2,
    mat = exampleMatrix1, 
    list = exampleList3
)
exampleList6
#$num
#[1] 12 13 14
#
#$char
#[1] "a" "b" "c" "d" "e" "f"
#
#$mat
#          [,1]        [,2]
#[1,] 0.5013050 -1.88801542
#[2,] 0.4295266  0.09751379
#
#$list
#$list[[1]]
#[1] "a"
#
#$list[[2]]
#[1] 1
#
#$list[[3]]
#[1] 2

リストの紹介

リストを使用すると、複数の要素(ベクトルや行列など)を単一のオブジェクトの下に格納できます。 list関数を使用してlistを作成することができます:

l1 <- list(c(1, 2, 3), c("a", "b", "c"))
l1
## [[1]]
## [1] 1 2 3
## 
## [[2]]
## [1] "a" "b" "c"

上記のリストを構成するベクトルは異なるクラスであることに注意してください。リストを使用すると、異なるクラスの要素をグループ化できます。リストの各要素には名前を付けることもできます。リスト名はnames関数によってアクセスされ、同じ方法で代入され、行と列の名前が行列に割り当てられます。

names(l1)
## NULL
names(l1) <- c("vector1", "vector2")
l1
## $vector1
## [1] 1 2 3
## 
## $vector2
## [1] "a" "b" "c"

リストオブジェクトの作成時にリスト名を宣言する方が簡単で安全です。

l2 <- list(vec = c(1, 3, 5, 7, 9),
       mat = matrix(data = c(1, 2, 3), nrow = 3))
l2
## $vec
## [1] 1 3 5 7 9
## 
## $mat
##      [,1]
## [1,]    1
## [2,]    2
## [3,]    3
names(l2)
## [1] "vec" "mat"

リストの上には、 "vec"と "mat"という2つの要素があり、ベクトルと行列が再解析されています。

リストを使用する理由

平均Rユーザにとって、リスト構造は、操作するより複雑なデータ構造の1つであるように見えるかもしれない。その中のすべての要素が同じ型であるという保証はありません。リストがどれほど複雑/非複雑であるかの保証された構造はありません(リスト内の要素はリストになる可能性があります)

しかし、主な理由の1つは、リストを使用して関数間でパラメーターを渡すときです。

# Function example which returns a single element numeric vector
exampleFunction1 <- function(num1, num2){
    result <- num1 + num2
    return(result)
}

# Using example function 1
exampleFunction1(1, 2)

# Function example which returns a simple numeric vector
exampleFunction2 <- function(num1, num2, multiplier){
    tempResult1 <- num1 + num2
    tempResult2 <- tempResult1 * multiplier
    result <- c(tempResult1, tempResult2)
    return(result) 
}

# Using example function 2
exampleFunction2(1, 2, 4)

上記の例では、返される結果は単なる単純な数値ベクトルです。このような単純なベクトルを渡す問題はありません。

この時点で、R関数は一度に1つの結果しか返さないことに注意してください(異なる結果を返す条件がある場合に使用できます)。しかし、パラメータのセットをとり、数値ベクトル(設定値)やデータフレーム(計算結果)などのいくつかのタイプの結果を返す関数を作成する場合は、これらの結果をすべてリストにダンプする必要がありますそれを返す前に。

# We will be using mtcars dataset here
# Function which returns a result that is supposed to contain multiple type of results
# This can be solved by putting the results into a list
exampleFunction3 <- function(dataframe, removeColumn, sumColumn){
    resultDataFrame <- dataframe[, -removeColumn]
    resultSum <- sum(dataframe[, sumColumn])
    resultList <- list(resultDataFrame, resultSum)
    return(resultList)
}

# Using example function 3
exampleResult <- exampleFunction3(mtcars, 2, 4)
exampleResult[[1]]
exampleResult[[2]]

空のリスト要素を保持しながらリストをベクトルに変換する

リストをvectorまたはdata.frameオブジェクトに変換する場合、通常、空の要素は削除されます。

これは、いくつかの空の値(例えば、n個の要素を持つリストがmxn行列、data.frame、またはdata.tableに追加されるように作成されたリスト)で、目的の長さのリストが作成されるという問題があります。空の要素を保持しながら、リストをベクトルに無損失で変換することは可能です。

res <- list(character(0), c("Luzhuang", "Laisu", "Peihui"), character(0), 
    c("Anjiangping", "Xinzhai", "Yongfeng"), character(0), character(0), 
    c("Puji", "Gaotun", "Banjingcun"), character(0), character(0), 
    character(0))
res
[[1]]
character(0)

[[2]]
[1] "Luzhuang" "Laisu"    "Peihui"  

[[3]]
character(0)

[[4]]
[1] "Anjiangping" "Xinzhai"     "Yongfeng"   

[[5]]
character(0)

[[6]]
character(0)

[[7]]
[1] "Puji"       "Gaotun"     "Banjingcun"

[[8]]
character(0)

[[9]]
character(0)

[[10]]
character(0)
res <- sapply(res, function(s) if (length(s) == 0) NA_character_ else paste(s, collapse = " "))
res
 [1] NA                             "Luzhuang Laisu Peihui"        NA                             "Anjiangping Xinzhai Yongfeng" NA      

 [6] NA                             "Puji Gaotun Banjingcun"       NA                             NA                             NA

シリアライゼーション:リストを使って情報を渡す

異なる種類のデータをまとめる必要がある場合があります。たとえば、Azure MLでは、Rスクリプトモジュールからの情報を、データフレームだけを介して別のモジュールに渡す必要があります。データフレームと数値があるとします。

> df
       name height        team fun_index title age         desc Y
1    Andrea    195       Lazio        97     6  33   eccellente 1
2      Paja    165  Fiorentina        87     6  31       deciso 1
3      Roro    190       Lazio        65     6  28       strano 0
4    Gioele     70       Lazio       100     0   2    simpatico 1
5     Cacio    170    Juventus        81     3  33         duro 0
6     Edola    171       Lazio        72     5  32     svampito 1
7    Salami    175       Inter        75     3  30  doppiopasso 1
8    Braugo    180       Inter        79     5  32          gjn 0
9     Benna    158    Juventus        80     6  28     esaurito 0
10   Riggio    182       Lazio        92     5  31     certezza 1
11 Giordano    185        Roma        79     5  29        buono 1

> number <- "42"

私たちはこの情報にアクセスすることができます:

> paste(df$name[4],"is a",df3$team[4], "supporter." )
[1] "Gioele is a  Lazio supporter."
> paste("The answer to THE question is", number )
[1] "The answer to THE question is 42"

異なるタイプのデータをデータフレームに入れるためには、リストオブジェクトと直列化を使用する必要があります。具体的には、データを汎用リストに入れてから、リストを特定のデータフレームに配置する必要があります。

l <- list(df,number)
dataframe_container <- data.frame(out2 = as.integer(serialize(l, connection=NULL)))

情報をデータフレームに格納したら、その情報をデシリアライズして使用する必要があります。

#----- unserialize ----------------------------------------+
unser_obj <- unserialize(as.raw(dataframe_container$out2))
#----- taking back the elements----------------------------+
df_mod        <- unser_obj[1][[1]]  
number_mod    <- unser_obj[2][[1]]

次に、データが正しく転送されたことを確認できます。

> paste(df_mod$name[4],"is a",df_mod$team[4], "supporter." )
[1] "Gioele is a  Lazio supporter."
> paste("The answer to THE question is", number_mod )
[1] "The answer to THE question is 42"


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