R 프로그래밍에서 리스트 사용 방법: 요소 생성 및 선택

⚡ 스마트 요약

R의 `List`는 벡터, 행렬, 데이터 프레임, 심지어 다른 리스트까지 하나의 컨테이너 안에 저장하는 객체입니다. `list()` 함수는 리스트를 생성하고, 이중 대괄호(`)를 사용하면 요소를 가져올 수 있습니다.

  • 🧺 혼합 저장: 리스트는 다양한 유형과 길이의 객체를 저장할 수 있지만, 일반 벡터는 그렇지 못합니다.
  • 🛠️ 빌드 단계: list(vect, mat, df)는 벡터, 행렬 및 데이터 프레임을 하나의 객체로 묶습니다.
  • 🔢 위치 접근 권한: my_list[[2]]는 요소 자체를 반환하는 반면 my_list[2]는 요소가 하나인 리스트를 반환합니다.
  • 🏷️ 명명된 요소: 요소를 생성할 때 태그를 지정하면 $ 연산자 또는 [[“name”]]을 통해 접근할 수 있습니다.
  • ✏️ 제자리 편집: 값을 다시 할당하면 요소가 업데이트되고, NULL을 할당하면 목록에서 해당 요소가 제거됩니다.
  • 🔗 편평화: unlist() 함수는 중첩된 리스트를 하위 분석을 위해 하나의 원자 벡터로 축소합니다.

R에서 리스트 생성 및 요소 선택하기

R 리스트란 무엇인가요?

R 목록 행렬, 벡터, 데이터 프레임 또는 목록을 포함하는 R 프로그래밍의 개체입니다. R List는 개체 컬렉션을 저장하고 필요할 때 사용하는 데에도 사용됩니다. R 목록을 다양한 항목을 담는 가방으로 상상할 수 있습니다. 아이템을 사용해야 할 때 가방을 열어 사용할 수 있습니다.

리스트가 유용한 이유는 벡터와의 대조 때문입니다. 벡터는 모든 요소를 ​​하나의 유형으로 강제하기 때문에 숫자 옆에 단어를 놓으면 숫자는 텍스트로 변환됩니다. 리스트는 이러한 규칙을 적용하지 않으므로 5개의 요소로 이루어진 벡터(두 줄로 이루어진 벡터)를 저장할 수 있습니다. 매트릭스 그리고 714행으로 구성된 데이터 프레임을 아무런 변경 없이 나란히 배치했습니다.

R의 목록 구문

R 프로그래밍에서 리스트를 생성하려면 list() 함수를 사용할 수 있습니다.

list(element_1, ...)
arguments:
-element_1: store any type of R object
-...: pass as many objects as specifying. each object needs to be separated by a comma

각 인수는 그대로 전달되거나 특정 형태로 전달될 수 있습니다. 태그 = 값이름만 있는 인수는 번호로만 접근할 수 있는 위치 요소가 되지만, 태그가 지정된 인수는 이름도 갖게 됩니다. 기본 R 참조는 다음과 같습니다. 명부() 문서에는 unlist()가 as.list()의 대략적인 역함수 역할을 한다는 내용이 포함되어 있습니다.

R에서 목록을 만드는 방법

다음은 R에서 목록을 만드는 방법에 대한 단계별 프로세스입니다.

아래 예에서는 벡터, 매트릭스, 세 가지 객체를 생성합니다. 데이터 프레임 R에서 목록 기능을 사용합니다.

1단계) 벡터 생성

아래 코드를 사용하여 R에서 벡터를 만듭니다.

# Vector with numeric from 1 up to 5
vect  <- 1:5

콜론 연산자는 1, 2, 3, 4, 5의 시퀀스를 정수 벡터로 구성하고, 할당 화살표는 이를 vect라는 이름으로 저장합니다.

2단계) 매트릭스 생성

이제 다음 코드를 사용하여 행렬을 생성하세요.

# A 2x 5 matrix
mat  <- matrix(1:9, ncol = 5)
dim(mat)

여기서 두 가지 사항에 주목해야 합니다. 2행 5열의 그리드에는 10개의 값이 필요하지만 9개만 제공되므로 R은 시퀀스를 재사용하고 데이터 길이가 행 수의 약수가 아니라는 경고를 출력합니다. 재사용된 값 때문에 출력된 행렬의 두 번째 행이 10이 아닌 1로 끝나는 것입니다. 그런 다음 dim() 함수 호출은 셰이프를 보고합니다.

출력:

## [1] 2 5

3단계) ​​데이터 프레임 생성

아래 코드를 사용하여 R에서 데이터 프레임을 만듭니다.

# select the 10th row of the built-in R data set EuStockMarkets
df <- EuStockMarkets[1:10,]

주석에는 열 번째 행이 언급되어 있지만, 해당 표현식은 내장 EuStockMarkets 시리즈의 1행부터 10행까지만 유지합니다. 부분집합 추출은 시계열 클래스도 제거하므로, 반환되는 결과는 실제 데이터 프레임이 아닌 숫자 행렬입니다. 바로 이 때문에 아래 출력 결과에 행 이름 대신 [1,] 스타일의 행 레이블이 표시됩니다. 실제 데이터 프레임이 필요한 경우에는 as.data.frame()으로 호출을 감싸십시오.

4단계) R에서 목록 만들기

이제 아래 코드를 사용하여 세 개의 개체를 R 목록에 넣을 수 있습니다.

# Construct list with these vec, mat, and df:
my_list <- list(vect, mat, df)
my_list

출력:

## [[1]]
## [1] 1 2 3 4 5

## [[2]]
##       [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8    1

## [[3]]
##          DAX    SMI    CAC   FTSE
##  [1,] 1628.75 1678.1 1772.8 2443.6
##  [2,] 1613.63 1688.5 1750.5 2460.2
##  [3,] 1606.51 1678.6 1718.0 2448.2
##  [4,] 1621.04 1684.1 1708.1 2470.4
##  [5,] 1618.16 1686.6 1723.1 2484.7
##  [6,] 1610.61 1671.6 1714.3 2466.8
##  [7,] 1630.75 1682.9 1734.5 2487.9
##  [8,] 1640.17 1703.6 1757.4 2508.4
##  [9,] 1635.47 1697.5 1754.0 2510.5
##  [10,] 1645.89 1716.3 1754.3 2497.4

해당 출력에 있는 세 개의 이중 대괄호 헤더는 리스트의 위치를 ​​나타냅니다. 어떤 요소도 평면화되거나 강제 변환되지 않았습니다. 첫 번째 요소는 여전히 정수 벡터이고, 두 번째 요소는 여전히 행렬이며, 세 번째 요소는 여전히 10개 행의 주가를 모두 포함하고 있습니다.

R 목록에서 요소 선택

리스트를 만든 후에는 아주 쉽게 접근할 수 있습니다. 리스트에서 요소를 선택하려면 [[인덱스]]를 사용해야 합니다. 이중 대괄호 안의 값은 리스트에서 원하는 항목의 위치를 ​​나타냅니다.trac예를 들어, 괄호 안에 2를 입력하면 R은 나열된 두 번째 요소를 반환합니다.

이제 이것에서 R 튜토리얼, R에서 my_list라는 목록의 두 번째 항목을 선택해 보겠습니다. my_list[[2]]를 사용합니다.

# Print second element of the list
my_list[[2]]

출력:

##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8    1

홑괄호와 겹괄호는 서로 바꿔 쓸 수 없으며, 이 둘을 혼동하는 것이 리스트 오류의 가장 흔한 원인입니다. 홑괄호는 래퍼를 유지하고, 겹괄호는 래퍼를 제거합니다.

표현 돌아오는 것 결과의 클래스 사용할 때 사용하세요
my_list[[2]] 저장된 요소 자체 저장된 내용이 무엇이든, 여기에는 행렬이 있습니다. 하나의 요소에 대해 계산해야 합니다.
my_list[2] 해당 요소 하나를 포함하는 하위 목록 명부 리스트 래퍼를 유지해야 합니다.
my_list[c(1, 3)] 선택된 요소의 하위 목록 명부 여러 요소가 동시에 필요합니다
내_목록[-2] 두 번째 요소를 제외한 모든 요소 명부 요소를 하나 제거해야 합니다.
# Compare the two bracket styles
class(my_list[[2]])   # the matrix itself
class(my_list[2])     # a list of length one

# Several elements, and everything but one element
my_list[c(1, 3)]
my_list[-2]

R에서 이름이 지정된 리스트

위치 인덱스는 불안정합니다. 요소를 하나 삽입하면 그 이후의 모든 숫자가 이동하게 됩니다. 요소에 이름을 지정하면 이러한 위험을 제거하고 코드가 설명하는 데이터처럼 읽기 쉬워집니다. 이름은 리스트를 생성할 때 제공하거나 names() 함수를 사용하여 나중에 추가할 수 있습니다.

# Tag each element at creation time
named_list <- list(numbers = vect, grid = mat, prices = df)

# Three ways to reach the same element
named_list$grid
named_list[["grid"]]
named_list["grid"]      # returns a one-element list

# Read or replace the names later
names(named_list)
names(named_list)[2] <- "grid_2x5"

$ 연산자와 이중 대괄호는 초보자들이 혼동하기 쉬운 한 가지 차이점이 있습니다. $ 연산자는 부분 일치를 수행하므로 `named_list$pri`는 가격을 찾을 수 있지만, 이중 대괄호는 `exact = FALSE`를 지정하지 않으면 정확히 일치시키기 때문에 `named_list[[“pri”]]`는 NULL을 반환합니다. 부분 일치는 콘솔에서는 편리하지만 스크립트에서는 안전하지 않으므로 저장된 코드에서는 정확한 형식을 사용하는 것이 좋습니다.

# A compact map of the whole structure
str(named_list)

str() 함수는 각 요소의 유형과 크기를 한 줄씩 출력하므로, 리스트에 접근할 때 예상한 요소가 포함되어 있는지 가장 빠르게 확인할 수 있습니다.

R 리스트의 요소 수정, 추가 및 삭제

리스트는 생성된 후에도 고정되지 않습니다. 요소를 읽는 데 사용되는 접근자 메서드는 요소에 쓰는 데에도 사용되므로, 리스트를 업데이트하거나 확장하거나 축소하는 모든 작업은 일반적인 할당 연산자를 사용합니다.

# Replace an element in place
named_list[["numbers"]] <- 1:10

# Add a new element simply by naming it
named_list[["created"]] <- Sys.Date()

# Append without a name: the element lands at the end
named_list <- append(named_list, list(TRUE))

# Delete an element by assigning NULL to it
named_list[["created"]] <- NULL
  • 교체 : 기존 이름을 할당하면 해당 요소가 덮어쓰여지고 위치는 변경되지 않습니다.
  • 추가 : 존재하지 않는 이름을 할당하면 목록의 끝에 새 요소가 추가됩니다.
  • 추가 : append() 메서드는 두 번째 인수로 리스트를 받으므로, 값을 전달하기 전에 list()로 감싸야 합니다.
  • 지우다: NULL 값을 이중 대괄호로 묶으면 해당 요소가 제거되어 목록이 짧아집니다.

한 가지 결과가 사람들을 자주 헷갈리게 하는데, NULL은 삭제를 의미하기 때문에 이중 대괄호를 사용해서는 실제 NULL 값을 저장할 수 없습니다. 대신 단일 대괄호를 사용한 할당을 사용해야 합니다. 예를 들어 `named_list[“empty”] <- list(NULL)`처럼 하면 슬롯은 유지하면서 그 안에 NULL 값을 넣을 수 있습니다.

R에서 중첩 리스트와 unlist() 함수

리스트는 모든 R 객체를 담을 수 있으므로, 또 다른 리스트를 담을 수도 있습니다. R에서는 설정 객체, JSON 응답, 모델 결과 등을 표현할 때 일반적으로 중첩 구조를 사용하므로, 중첩된 리스트에 접근하거나 리스트를 평탄화하는 것은 일상적인 작업입니다.

# A list whose elements are themselves lists
project <- list(
  meta = list(owner = "analyst", year = 2026),
  data = list(vect, mat)
)

# Chain the accessors to reach an inner value
project$meta$year
project[["data"]][[2]]

# Flatten every level into one atomic vector
flat <- unlist(project)

# Strip a single level and keep the rest as a list
half <- unlist(project, recursive = FALSE)

리스트를 평면화하는 데에는 이해할 만한 비용이 있습니다. `unlist()` 함수는 하나의 원자 벡터를 반환해야 하므로, 논리값, 정수, 실수, 문자 순서로 모든 값을 가장 일반적인 유형으로 강제 변환합니다. 따라서 숫자와 텍스트가 혼합된 중첩 리스트는 모두 텍스트로 반환됩니다. 결과의 이름은 외부 태그와 내부 태그를 결합하여 생성되므로 요소가 `owner`가 아닌 `meta.owner`로 반환되는 것입니다.

복합 이름을 사용하지 않으려면 `use.names = FALSE`를 전달하고, 가장 바깥쪽 레이어만 제거하려면 `recursive = FALSE`로 설정하세요. 값의 유형을 유지해야 하는 경우, 구조를 그대로 두고 리스트를 평면화하는 대신 순회하세요.

R에 내장된 데이터 프레임

리스트는 종종 디스크나 웹에서 읽어온 데이터로 채워지기 때문에, 데이터 프레임이 리스트에 저장되기 전에 어떤 형태로 생성되는지 살펴보는 것이 유용합니다. 자체 데이터 프레임을 만들기 전에 온라인에서 제공되는 R 데이터 세트를 살펴볼 수 있습니다. prison 데이터 세트는 714×5 크기입니다. `tail()` 함수를 사용하면 데이터 프레임의 맨 아래 부분을 빠르게 확인할 수 있습니다. 마찬가지로 `head()` 함수는 데이터 프레임의 맨 위를 표시합니다. `head(df, 5)`와 같이 표시할 행 수를 지정할 수도 있습니다. `read.csv()` 함수에 대해서는 나중에 자세히 알아보겠습니다. R에서 데이터 가져오기 튜토리얼.

PATH <-'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/prison.csv'
df <- read.csv(PATH)[1:5]
head(df, 5)

출력:

##   X state year govelec black
## 1 1     1   80       0 0.2560
## 2 2     1   81       0 0.2557
## 3 3     1   82       1 0.2554
## 4 4     1   83       0 0.2551
## 5 5     1   84       0 0.2548

read.csv() 다음에 오는 [1:5]는 첫 번째 다섯 행이 아니라 첫 번째 다섯 열을 선택합니다. 데이터 프레임 자체가 열의 목록이기 때문입니다. 목록에 대한 단일 대괄호 인덱싱은 더 작은 목록을 반환하며, 여기서 그 더 작은 목록은 여전히 ​​데이터 프레임입니다.

str을 사용하여 데이터 프레임의 구조를 확인할 수 있습니다.

# Structure of the data
str(df)

출력:

## 'data.frame':    714 obs. of  5 variables:
##  $ X      : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ state  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ year   : int  80 81 82 83 84 85 86 87 88 89 ...
##  $ govelec: int  0 0 1 0 0 0 1 0 0 0 ...
##  $ black  : num  0.256 0.256 0.255 0.255 0.255 ...

모든 변수는 수치의 형식입니다. 각 줄의 접두사 '$'는 이전에 명명된 목록에서 사용했던 것과 동일한 연산자이며, 이는 데이터 프레임이 직사각형 레이블이 있는 동일한 길이의 열 목록임을 확인시켜 줍니다. 따라서 목록 요소의 이름 지정, 선택 및 삭제에 대해 배운 모든 내용은 데이터 프레임에도 그대로 적용됩니다. R 데이터 유형 그리고 데이터프레임 열로 변환합니다.

자주 묻는 질문

벡터는 모든 요소가 동일한 데이터 유형을 공유하도록 강제하므로 텍스트와 숫자를 혼합하면 모든 요소가 문자로 변환됩니다. 리스트는 벡터, 행렬, 길이가 다른 함수 등 모든 요소를 ​​제공된 그대로 유지합니다. typeof() 함수를 사용하여 둘을 구분할 수 있습니다.

`is.list(x)`를 호출하면 리스트와 페어리스트에 대해 `TRUE`를 반환합니다. `class(x)`는 객체의 클래스를 보고하고, `typeof(x)`는 데이터 프레임의 경우에도 "list"를 반환합니다. 데이터 프레임은 기본적으로 길이가 같은 열들의 리스트이기 때문입니다.

`length(my_list)`는 최상위 요소만 계산하므로 중첩된 리스트도 하나로 계산됩니다. `lengths(my_list)`는 모든 요소의 크기를 한 번에 계산하므로 `loo`보다 빠르고 명확합니다.ping 구성 요소가 다를 때.

lapply(my_list, FUN)은 다음을 적용합니다. 기능 `sapply()`는 모든 요소를 ​​순회하며 리스트를 반환합니다. 가능한 경우 결과를 벡터 또는 행렬로 간소화합니다. `seq_along(my_list)`를 사용하는 일반 `for` 루프도 작동하며 가독성이 좋습니다.

모든 요소의 길이가 같을 경우 as.data.frame(my_list)는 바로 작동합니다. 행의 너비가 모두 같은 리스트의 경우 do.call(rbind, my_list)는 먼저 행들을 쌓습니다. dplyr 에코시스템은 컬럼 유형이 변경되지 않고 유지되어야 할 때 as_tibble() 함수를 제공합니다.

리스트에는 정렬 기능이 내장되어 있지 않으므로, 예를 들면trac비교 가능한 키를 먼저 지정하세요: my_list[order(sapply(my_list, length))]는 요소 크기에 따라 재정렬합니다. 직사각형 데이터의 경우 프레임으로 변환하고 데이터프레임을 정렬합니다 order() 대신 다른 함수를 사용하세요.

AI 비서는 str() 함수의 출력 결과를 읽고 인덱스가 값 대신 NULL이나 하위 목록을 반환한 이유를 설명합니다. 또한 올바른 대괄호 형식을 제안하고, lapply() 파이프라인을 작성하며, 결과가 손상되기 전에 암묵적인 유형 강제 변환을 표시합니다.

예. GitHub 부조종사 ~에서 작동하다 RStudio 2023년 9월 0일 이후 버전에서는 도구, 전역 옵션, 코드 도우미 설정을 통해 이용할 수 있습니다. 주석에서 list(), names(), unlist() 함수 호출을 자동으로 완성해 주지만, 모든 제안은 검토가 필요합니다.

이 게시물을 요약하면 다음과 같습니다.