R Language
기울기
수색…
목록 빠른 소개
일반적으로 사용자로 상호 작용할 객체의 대부분은 벡터 경향이 있습니다. 예 : 숫자 벡터, 논리 벡터. 이 객체는 하나의 변수 유형을 사용할 수 있습니다 (숫자 벡터는 숫자 만 가질 수 있습니다).
목록은 모든 유형 변수를 저장할 수 있으므로 필요한 모든 유형의 변수를 저장할 수있는 일반 객체로 만듭니다.
목록 초기화의 예
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"