수색…


목록 빠른 소개

일반적으로 사용자로 상호 작용할 객체의 대부분은 벡터 경향이 있습니다. 예 : 숫자 벡터, 논리 벡터. 이 객체는 하나의 변수 유형을 사용할 수 있습니다 (숫자 벡터는 숫자 만 가질 수 있습니다).

목록은 모든 유형 변수를 저장할 수 있으므로 필요한 모든 유형의 변수를 저장할 수있는 일반 객체로 만듭니다.

목록 초기화의 예

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"이라는 벡터와 매트릭스라는 두 가지 요소가 있습니다.

목록을 사용하는 이유

평균 R 사용자에게는 목록 구조가 조작하기에 더 복잡한 데이터 구조 중 하나처럼 보일 수 있습니다. 그 안에있는 모든 요소가 동일한 유형이라는 보장은 없습니다. 목록이 얼마나 복잡하고 복잡하지 않은지에 대한 보장 된 구조는 없습니다 (목록의 요소는 목록이 될 수 있음)

그러나 목록을 사용하여 함수간에 매개 변수를 전달할 때 주로 사용하는 주된 이유 중 하나입니다.

# 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