이전 포스팅에서는 numpy 배열의 원소 값을 사전(dictionary)의 (Key, Value)를 매핑해서 변환하는 방법을 소개하였습니다. (rfriend.tistory.com/620)

 

이번 포스팅에서는 Python numpy 의 array 배열의 순서대로 정수를 사전의 키(Key)로 하고, 배열 값을 사전의 값(Value)으로 하는 Python 사전(dictionary) 으로 변환하는 몇 가지 방법을 소개하겠습니다.

 

(1) dict() 와 enumerate() 함수를 이용해 배열로 부터 사전 만들기

(2) for loop 과 enumerate() 함수를 이용해 배열로 부터 사전 만들기

 

 

 

(1) dict() 와 enumerate() 함수를 이용해 배열로 부터 사전 만들기

 

먼저, numpy 라이브러리를 불러오고, 예제로 사용할 (5, 0) shape 의 numpy array 배열을 하나 만들어보겠습니다.

 

import numpy as np

cls_weight = np.array([0.30, 0.50, 0.10, 0.03, 0.07])
cls_weight
[Out]
array([0.3 , 0.5 , 0.1 , 0.03, 0.07])

cls_weight.shape
[Out] 
(5,)

 

 

위의 'cls_weight' 배열을 사전(dictionary)으로 변환해보겠습니다. 사전(dict) 키(Key)가 '0' 부터 시작하고, 배열의 순서대로 사전의 키가 하나씩 증가하며, 배열의 순서대로 사전에 값을 할당하여 보겠습니다.  dict() 함수는 객체를 '키(Key) : 값(Value)' 의 쌍을 가지는 사전형 자료구조를 만들어줍니다.

 

## converting numpy array to dictionary, 
## dict key is starting from 0
cls_weight_dict_from_0 = dict(enumerate(cls_weight))

cls_weight_dict_from_0
[Out]
{0: 0.3, 1: 0.5, 2: 0.1, 3: 0.03, 4: 0.07}

 

 

이때 dict() 안의 enumerate() 메소드는 객체를 순환할 때 회수를 세어주는 counter 를 같이 생성해서 enumerate 객체를 반환합니다. for loop 으로 enumerate 객체를 순환하면서 counter 와 배열 내 값을 차례대로 출력을 해보면 아래와 같습니다.

## enumerate() method adds a counter to an iterable 
## and returns it in a form of enumerate object
for i, j in enumerate(cls_weight):
    print(i, ':', j)
    
[Out]
0 : 0.3
1 : 0.5
2 : 0.1
3 : 0.03
4 : 0.07

 

 

경우에 따라서는 배열의 값으로 사전을 만들었을 때, 사전의 키 값이 '0'이 아니라 '1'이나 혹은 다른 숫자로 부터 시작하는 것을 원할 수도 있습니다. 이럴 경우 enumerate(iterable_object, 1) 처럼 원하는 숫자(아래 예에서는 '1')를 추가해주면 그 값이 더해져서 counter 가 생성이 됩니다.

 

## converting numpy array to dictionary, 
## dict key is starting from 1

cls_weight_dict_from_1 = dict(enumerate(cls_weight, 1))

cls_weight_dict_from_1
[Out]
{1: 0.3, 2: 0.5, 3: 0.1, 4: 0.03, 5: 0.07}

 

 

만약 사전(dictionary)으로 변환하려고 하는 numpy array의 axis 1의 축이 있다면 flatten() 메소드를 사용해서 axis 0 만 있는 배열로 먼저 평평하게 펴준 (axis 1 축을 없앰) 후에 위의 dict(enumerate()) 를 똑같이 사용해주면 됩니다.  아래 예는 shape (5, 1) 의 배열을 flatten() 메소드를 써서 shape (5, 0) 으로 바꿔준 후에 dict(enumerate()) 로 배열을 사전으로 변환해주었습니다.

 

## array with axis1
cls_weight_2 = np.array([[0.30], [0.50], [0.10], [0.03], [0.07]])
cls_weight_2
[Out]
array([[0.3 ],
       [0.5 ],
       [0.1 ],
       [0.03],
       [0.07]])


cls_weight_2.shape
[Out]
(5, 1)


## use flatten() method to convert shape (5, 1) to (5, 0)
cls_weight_dict_2 = dict(enumerate(cls_weight_2.flatten()))
print(cls_weight_dict_2)
[Out]
{0: 0.3, 1: 0.5, 2: 0.1, 3: 0.03, 4: 0.07}

 

 

 

(2) for loop 과 enumerate() 함수를 이용해 배열로 부터 사전 만들기

 

이번에는 for loop 과 enumerate() 메소드를 같이 이용하는 방법입니다. 위의 (1) 번 대비 좀 복잡한 느낌이 있기는 하지만, (1) 번 대비 (2) 방법은 for loop 안의 코드 블럭에 좀더 자유롭게 원하는 복잡한 로직을 녹여서 사전(dictionary)을 구성할 수 있다는 장점이 있습니다.

 

아래 예에서는 (a) 먼저 cls_weight_dict_3 = {} 로 비어있는 사전을 만들어 놓고, (b) for loop 으로 순환 반복을 하면서 enumerate(cls_weight) 가 반환해주는 (counter, 배열값) 로 부터 counter 정수 숫자를 받아서 cls_weight_dict_3 의 키(Key) 로 할당해주고, 배열의 값을 사전의 해당 키에 할당해주는 방식입니다.  사전의 키에 값 할당(assinging Value to dict by mapping Key)은 Dict[Key] = Value 구문으로 해줍니다.

 

cls_weight = np.array([0.30, 0.50, 0.10, 0.03, 0.07])
cls_weight
[Out]
array([0.3 , 0.5 , 0.1 , 0.03, 0.07])

## Converting a numpy array to a dictionary
## Dict key is starting from 0
cls_weight_dict_3 = {}

for i, c_w in enumerate(cls_weight):
    cls_weight_dict_3[i] = c_w
    

print(cls_weight_dict_3)
[Out]
{0: 0.3, 1: 0.5, 2: 0.1, 3: 0.03, 4: 0.07}

 

 

사전의 키를 '0' 이 아니라 '1'부터 시작하게 하려면 enumerate()의 counter가 0부터 시작하므로, counter를 사전의 키에 할당할 때 'counter+1' 을 해주면 됩니다.

 

## converting a numpy array to a dictionary using for loop
## dict key is strating from 1

## null dict
cls_weight_dict_3_from_1 = {}

## assigning values by keys + 1
for i, c_w in enumerate(cls_weight):
    cls_weight_dict_3_from_1[i+1] = c_w
    
    
print(cls_weight_dict_3_from_1)
[Out]
{1: 0.3, 2: 0.5, 3: 0.1, 4: 0.03, 5: 0.07}

 

 

이번 포스팅이 많은 도움이 되었기를 바랍니다.

행복한 데이터 과학자 되세요! :-)

 

Posted by R Friend Rfriend

댓글을 달아 주세요

이번 포스팅에서는 1차원 배열 내 고유한 원소 집합 (a set with unique elements) 을 찾고, 더 나아가서 고유한 원소별 개수(counts per unique elements)도 세어보고, 원소 개수를 기준으로 정렬(sorting)도 해보는 여러가지 방법을 소개하겠습니다.

 

 

(1) numpy 1D 배열 안에서 고유한 원소 집합 찾기
    (finding a set with unique elements in 1D numpy array)

(2) numpy 1D 배열 안에서 고유한 원소 별로 개수 구하기
    (counts per unique elements in 1D numpy array)

(3) numpy 1D 배열 안에서 고유한 원소(key) 별 개수(value)를 사전형으로 만들기

    (making a dictionary with unique sets and counts of 1D numpy array)

(4) numpy 1D 배열의 고유한 원소(key) 별 개수(value)의 사전을 정렬하기

    (sorting a dictionary with unique sets and counts of 1D numpy array)

(5) numpy 1D 배열을 pandas Series 로 변환해서 고유한 원소 별 개수 구하고 정렬하기

    (converting 1D array to pandas Series, and value_counts(), sort_values())

(6) numpy 1D 배열을 pandas DataFrame으로 변환해 고유 원소별 개수 구하고 정렬하기

    (converting 1D array to pandas DataFrame, and value_counts(), sort_values())

 

 

 

 

먼저, 예제로 사용할 간단한 numpy 1D 배열을 만들어보겠습니다.

 

## simple 1D numpy array

import numpy as np

arr = np.array(['a', 'c', 'c', 'b', 'a', 
                'b', 'b', 'c', 'a', 'c', 
                'b', 'a', 'a', 'a', 'c'])
                
                
arr
[Out] array(['a', 'c', 'c', 'b', 'a', 'b', 'b', 'c', 'a', 'c', 
             'b', 'a', 'a', 'a', 'c'], dtype='<U1')
             

 

 

(1) numpy 1D 배열 안에서 고유한 원소 집합 찾기
    (finding a set with unique elements in 1D numpy array)

 

np.unique() 메소드를 사용하면 numpy 배열 내 고유한 원소(unique elements)의 집합을 찾을 수 있습니다.

 

## np.unique(): Find the unique elements of an array
np.unique(arr)
[Out] 
array(['a', 'b', 'c'], dtype='<U1')

 

 

더 나아가서, return_inverse=True 매개변수를 설정해주면, 아래의 예처럼 numpy 배열 내 고유한 원소의 집합 배열과 함께 '고유한 원소 집합 배열의 indices 의 배열' 을 추가로 반환해줍니다.

따라서 이 기능을 이용하면 array(['a', 'c', 'c', 'b', 'a', 'b', 'b', 'c', 'a', 'c', 'b', 'a', 'a', 'a', 'c']) 를 ==> array([0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 1, 0, 0, 0, 2]) 로 쉽게 변환할 수 있습니다.

 

## return_inverse=True: If True, also return the indices of the unique array
np.unique(arr, 
          return_inverse=True)
[Out]
(array(['a', 'b', 'c'], dtype='<U1'),
 array([0, 2, 2, 1, 0, 1, 1, 2, 0, 2, 1, 0, 0, 0, 2]))
 

 

 

 

(2) numpy 1D 배열 안에서 고유한 원소 별로 개수 구하기
    (counts per unique elements in 1D numpy array)

 

위의 (1)번에서 np.unique() 로 numpy 배열 내 고유한 원소의 집합을 찾았다면, return_counts = True 매개변수를 설정해주면 각 고유한 원소별로 개수를 구해서 배열로 반환할 수 있습니다.

 

## return_counts: If True, also return the number of times each unique item appears in ar.
np.unique(arr, 
          return_counts = True)     

[Out]
(array(['a', 'b', 'c'], dtype='<U1'), array([6, 4, 5]))

 

 

 

(3) numpy 1D 배열 안에서 고유한 원소(key) 별 개수(value)를 사전형으로 만들기

    (making a dictionary with unique sets and counts of 1D numpy array)

 

위의 (2)번에서 각 고유한 원소별 개수를 구해봤는데요, 이를 파이썬의 키:값 쌍 (key: value pair) 형태의 사전(dictionary) 객체로 만들어보겠습니다.

 

먼저 np.unique(arr, return_counts = True) 의 결과를 unique, counts 라는 이름의 array로 할당을 받고, 이를 zip(unique, counts) 으로 쌍(pair)을 만들어준 다음에, dict() 를 사용해서 사전형으로 변환해주었습니다.

 

## making a dictionary with unique elements and counts of 1D array
unique, counts = np.unique(arr, return_counts = True)
uniq_cnt_dict = dict(zip(unique, counts))

uniq_cnt_dict
[Out]
{'a': 6, 'b': 4, 'c': 5}

 

 

 

(4) numpy 1D 배열의 고유한 원소(key) 별 개수(value)의 사전을 정렬하기

    (sorting a dictionary with unique sets and counts of 1D numpy array)

 

위의 (3)번까지 잘 진행을 하셨다면 이제 (unique : counts) 쌍의 사전을 'counts' 의 값을 기준으로 오름차순 정렬(sorting a dict by value in ascending order) 또는 내림차순 정렬 (sorting a dict by value in descending order) 하고 싶은 마음이 생길 수 있는데요, 이럴 경우 sorted() 메소드를 사용하면 되겠습니다. (pytho dictionary 정렬 참조: rfriend.tistory.com/473)

 

## sorting a dictionary by value in ascending order
## -- reference: https://rfriend.tistory.com/473
sorted(uniq_cnt_dict.items(), 
       key = lambda x: x[1])
       
[Out]
[('b', 4), ('c', 5), ('a', 6)]


## sorting a dictionary by value in descending order
sorted(uniq_cnt_dict.items(), 
       reverse = True, 
       key = lambda x: x[1])
       
[Out]
[('a', 6), ('c', 5), ('b', 4)]

 

 

 

(5) numpy 1D 배열을 pandas Series 로 변환해 고유한 원소별 개수 구하고 정렬하기

    (converting 1D array to pandas Series, and value_counts(), sort_values())

 

pandas 의 Series 나 DataFrame으로 변환해서 데이터 분석 하는 것이 더 익숙하거나 편리한 상황에서는 pandas.Series(array) 나 pandas.DataFrame(array) 로 변환을 해서, value_count() 메소드로 원소의 개수를 세거나, sort_values() 메소드로 값을 기준으로 정렬을 할 수 있습니다.

 

import pandas as pd

## converting an array to pandas Series
arr_s = pd.Series(arr)
arr_s
[Out]
0     a
1     c
2     c
3     b
4     a
5     b
6     b
7     c
8     a
9     c
10    b
11    a
12    a
13    a
14    c
dtype: object


## counting values by unique elements of pandas Series
arr_s.value_counts()
[Out]
a    6
c    5
b    4
dtype: int64


## sorting by values in ascending order of pandas Series
arr_s.value_counts().sort_values(ascending=True)
[Out]
b    4
c    5
a    6
dtype: int64

 

 

(6) numpy 1D 배열을 pandas DataFrame으로 변환해 고유한 원소별 개수 구하고 정렬하기

    (converting 1D array to pandas DataFrame, and value_counts(), sort_values())

 

만약 pandas Series 내 고유한 원소별 개수를 구한 결과를 개수의 오름차순으로 정렬을 하고 싶다면 sort_values(ascending = True) 를 설정해주면 됩니다. (내림차순이 기본 설정, default to descending order)

 

import pandas as pd

## converting an array to pandas DataFrame
arr_df = pd.DataFrame(arr, columns=['x1'])
arr_df

[Out]
x1
0	a
1	c
2	c
3	b
4	a
5	b
6	b
7	c
8	a
9	c
10	b
11	a
12	a
13	a
14	c


## counting the number of unique elements in Series
arr_df['x1'].value_counts()
[Out]
a    6
c    5
b    4
Name: x1, dtype: int64


## # sorting by the counts of unique elements in ascending order
arr_df['x1'].value_counts().sort_values(ascending=True)
[Out]
b    4
c    5
a    6
Name: x1, dtype: int64

 

 

이번 포스팅이 많은 도움이 되었기를 바랍니다.

행복한 데이터 과학자 되세요!  :-)

 

Posted by R Friend Rfriend

댓글을 달아 주세요


SAS나 SPSS를 사용하다가 R을 처음 배우는 사용자라면 R에서 7개로 나누는 데이터 구조에 대해서 '이걸 왜 배우지? SAS나 SPSS는 이런거 모르고도 아무 문제 없이 데이터 처리, 분석 다 했었는데...'라는 의문과 함께, 'R 이거 배우기 어렵네...'라고 푸념할 수도 있겠습니다. 제가 그랬거든요. (SAS나 SPSS에서 주로 사용했던 데이터 구조가 R의 데이터 구조 중에서는 '데이터 프레임' or '행렬'이라고 하는 구조라고 생각하시면 됩니다. 전부다는 아니고 많은 경우....)


R의 데이터 구조별 특성에 대해서 정확하게 이해하지 않으면 나중에 데이터 처리, 분석 넘어갔을 때 자꾸 헷갈리고, 에러가 났을 때 에러 메시지가 무슨 의미인지 이해를 못할 가능성이 높습니다. 데이터 구조에 따라서 분석기법이 달라지게 되거든요. 라틴댄스로 치자면 빨리 '패턴' 배워서 멋지게 파트너와 춤추고 싶은데 선생님은 한달이고 두달이고 '스탭'만 연습시키는데요, 어찌보면 따분하고 답답한 '스탭' 기본기가 R로 치면 데이터 구조라고 생각하시면 되겠습니다. R의 기본이 되는 중요한 개념이므로, 그리고 나중에 이게 제대로 이해가 되고 R이 손에 익었다 싶을 때 다시 되돌아 보면 R에서 데이터 구조를 이렇게 나누어서 분석 기법을 달리 하는 것이 R의 차별화된 장점이자 특징이겠구나 하고 느끼게 되는 시점이 올겁니다. 


R 데이터 구조는 (1) 스칼라, (2) 벡터, (3) 요인, (4) 행렬, (5) 배열, (6) 데이터프레임, (7) 리스트의 7개로 나눌 수 있습니다. 하나씩 설명을 할텐데요, 처음에 잘 이해가 안가도 자꾸 R 사용하면서 다시 이번 포스팅 다시 돌아와서 한번씩 복습하시면 이해되는 날이 올거예요. (제가 Coursera로 강의 듣는데 R 데이터 구조라면서 강사가 막 영어로 뭐라 뭐라 하는데.... 뭔 소리인지 이해도 안되고, 이걸 왜 배우나 싶고, 짜증도 나고, 좌절도 되고...암튼 그랬는데요, 어느 순간 지나서 보니깐 다 이해를 하고 있더라고요. 한번 보고서 이해 안된다고 좌절하지 마시라는 뜻에서 자꾸 같은 소리 하고 있습니다. ^^;;;)



1. 스칼라 (Scala)


구성인자가 하나인 벡터를 말합니다. 


> # 스칼라 (Scala) : 구성인자가 1개인 벡터

> s1 <- c(1)

> s2 <- c("Kim") 



2. 벡터 (Vector)


벡터는 동일한 유형의 데이터가 구성인자가 1개 이상이면서 1차원으로 구성되어 있는 데이터 구조를 말합니다. 

(벡터 중에서 구성인자가 1개인 것을 '스칼라'라고 합니다)


> # Vector

> v1 <- c(1, 2, 3)                   # 숫자형 벡터

> v2 <- c("Kim", "Lee", "Choi")    # 문자형 벡터

> v3 <- c(TRUE, TRUE, FALSE)   # 논리형 벡터



3. 요인 (Factor) 


범주형(명목형 또는 순서형)의 데이터 구조를 요인(Factor)라고 합니다. 통계 분석 할 때 소위 '~~별' 분석을 할 때 쓰는게 요인이므로 굉장히 많이 사용됩니다. 나중에 분석을 하다보면 (1) '요인'으로 데이터를 변환해야 하는 경우도 생기고, (2) 반대로 '요인'이 아니어야 하는데 '요인'으로 데이터가 입력이 되어있어서 에러가 발생하는 경우도 생기곤 합니다. '요인'이 뭔지, 뭐에 쓰는 것인지 모르면 두 가지 경우 상황 파악을 못해서 곤혹스럽겠지요? 

요인이 가질 수 있는 값들을 '수준(level)'이라고 합니다. RDBMS에서의 '코드값'이라고 이해하면 되겠습니다. 수준(level)은 명목형은 상관없지만, 순서형의 경우 순서(order)를 부여할 수 있습니다. 분석 결과가 순서대로 범주화 되서 나와야 보기에 좋겠지요?


> # (1) 문자형 데이터를 그냥 입력하면, 따옴표가 있는 문자형 벡터가 생성

> f1 <- c("Middle", "Low", "High")

> f1

[1] "Middle" "Low"    "High"  

>

> # (2) factor()함수를 이용해서 문자형 벡터를 요인(factor)로 변환

> # 단, 순서를 지정 안해주면 알파벳 순서로 수준(level)이 자동으로 지정됨

> f2 <- factor(f1)

> f2

[1] Middle Low    High  

Levels: High Low Middle

>

> # (3) 수준(level)에 순서를 부여하려면 'order=TRUE' 옵션 설정, level=c("") 에 순서대로 입력

> f3 <- factor(f2, order = TRUE, level = c("Low", "Middle", "High"))

> f3

[1] Middle Low    High  

Levels: Low < Middle < High 



4. 행렬 (Matrix) 


행렬은 동일한 유형의 2차원 데이터 구조를 말합니다. (쉽게 말해 m x n 형태의 표 형태의 데이터)

참고로, 벡터는 동일한 유형의 1차원 데이터 구조라고 했지요. (쉽게 말해, 가로로 늘어선 한 줄 데이터)


행렬은 matrix() 라는 함수를 사용합니다. 

최적화(optimization) 할 때 제약조건을 행렬로 입력합니다. 공학에서 행렬 많이 사용합니다. 


> # 1~12까지의 숫자를 행(row)의 수가 4개인 행렬로 만들어라

> m1 <- matrix(1:12, nrow=4)

> m1

     [,1] [,2] [,3]

[1,]    1    5    9

[2,]    2    6   10

[3,]    3    7   11

[4,]    4    8   12

> # 1~12까지의 숫자를 행(row)의 수가 4개이고 행렬로 만드는데, 행 기준(byrow=TRUE)으로 채워나가라

> m2 <- matrix(1:12, nrow=4, byrow=TRUE)

> m2

     [,1] [,2] [,3]

[1,]    1    2    3

[2,]    4    5    6

[3,]    7    8    9

[4,]   10   11   12

>  



5. 배열 (Array) 


배열(Array)은 동일한 유형의 데이터가 2차원 이상으로 구성된 구조를 말합니다. 

참고로, 행렬은 동일한 유형의 2차원 데이터 구조라고 했지요. 따라서 배열은 쉽게 말해 행렬이라는 방을 층 층이 쌓아놓은 아파트라고 생각하시면 되겠습니다. 


> # 1~24까지의 숫자를 '2 x 3 행렬'로 해서 '4층' 짜리의 데이터 구조를 만들어라

> a1 <- array(1:24, c(2,3,4))

> a1

, , 1


     [,1] [,2] [,3]

[1,]    1    3    5

[2,]    2    4    6


, , 2


     [,1] [,2] [,3]

[1,]    7    9   11

[2,]    8   10   12


, , 3


     [,1] [,2] [,3]

[1,]   13   15   17

[2,]   14   16   18


, , 4


     [,1] [,2] [,3]

[1,]   19   21   23

[2,]   20   22   24 



> # 1~24까지의 숫자를 '3 x 4' 행렬로 해서 '2층'짜리의 데이터 구조를 만들어라

> a2 <- array(1:23, c(3,4,2))

> a2

, , 1


     [,1] [,2] [,3] [,4]

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12


, , 2


     [,1] [,2] [,3] [,4]

[1,]   13   16   19   22

[2,]   14   17   20   23

[3,]   15   18   21    1





6. 데이터 프레임 (Data Frame) 


데이터 프레임데이터 유형에 상관없이 2차원 형태의 데이터 구조를 말합니다. 

참고로, 행렬동일한 유형의 데이터가 2차원 형태로 구성되었다고 했지요. 

통계, 마이닝 분석할 때 데이터 프레임을 주로 사용합니다. 


> # 다른 유형의 벡터 생성

> d1 <- c(1,2,3,4)

> d2 <- c("Kim", "Lee", "Choi", "Park")

> # 데이터 프레임으로 묶기 : data.frame() 함수 사용

> d3 <- data.frame(cust_id = d1, last_name = d2)  # 변수명 부여

> d3

  cust_id last_name

1       1       Kim

2       2       Lee

3       3      Choi

4       4      Park 



7. 리스트 (List) 


리스트는 벡터, 행렬, 배열, 데이터 프레임 등과 같은 서로 다른 구조의 데이터를 모두 묶은 객체를 말합니다. 

참고로, 리스트 말고 나머지들은 서로 다른 구조의 데이터 끼리는 묶어 놓지 않았고 따로 따로 였지요. 

R에서는 통계 분석 결과가 보통 리스트 구조로 제시되고, 필요로 하는 통계량이 있으면 indexing해서 뽑아서 쓰기도 합니다. 

서로 다른 구조의 다수의 데이터 객체를 개별로 따로 따로 관리하는 것보다는, 이것들을 리스트라는 한 바구니에 가지런히 정리해서 모아놓으면 관리하기에 편하겠지요? 


> # Vector(L1), Matrix(L2), Array(L3), Data Frame(L4)를 만들어서, 하나의 List(L5)로 묶어라

> L1 <- c(1, 2, 3, 4) # Vector

> L2 <- matrix(1:6, 3, byrow=TRUE) # Matrix

> L3 <- array(1:24, c(3,4,2)) # Array

> L4 <- data.frame(cust_id = c(1, 2, 3, 4), last_name = c("Kim", "Lee", "Choi", "Park")) # Data Frame

> L5 <- list(L1, L2, L3, L4) # List

>

> # [[1]]는 Vector(L1), [[2]]는 Matrix(L2), [[3]]는 Array(L3), [[4]]는 Data Frame(L4)가 묶인 것임

> L5

[[1]]

[1] 1 2 3 4


[[2]]

     [,1] [,2]

[1,]    1    2

[2,]    3    4

[3,]    5    6


[[3]]

, , 1


     [,1] [,2] [,3] [,4]

[1,]    1    4    7   10

[2,]    2    5    8   11

[3,]    3    6    9   12


, , 2


     [,1] [,2] [,3] [,4]

[1,]   13   16   19   22

[2,]   14   17   20   23

[3,]   15   18   21   24



[[4]]

  cust_id last_name

1       1       Kim

2       2       Lee

3       3      Choi

4       4      Park

 


지금까지 살펴본 R의 데이터 구조를 도식화하면 아래와 같습니다. 뭐가 뭐의 부분집한인지, 각 데이터 구조를 구분하는 기준은 무엇인지 유심히 다시 한번 살펴보기 정리해보면 좋겠습니다. 



[ R 데이터 구조 (Data Structure in R) ]



많은 도움 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^


Posted by R Friend Rfriend

댓글을 달아 주세요

  1. ㅇㅇㅇ 2016.12.13 08:47  댓글주소  수정/삭제  댓글쓰기

    흐 어렵지만.. 조금씩 배우면 할 수 있겠죠

  2. 온봄 2017.03.27 12:25  댓글주소  수정/삭제  댓글쓰기

    그간 R을 전혀 R지못해서, 조금씩 R아가고 있는데요~
    선생님이 차근차근 정리해주신 내용들이 참 많은 도움이 되고 있습니다 ^^ 이해하기 쉽게 친절히 정리해주셔서 고맙습니다.

  3. r뻔 2017.04.12 18:55  댓글주소  수정/삭제  댓글쓰기

    코세라하면서 멍하니 막막해 하고 있었는데 한 줄기 단비 같은 정리 입니다. 이렇게 고급진 메뉴얼에 너무 감사드리고 앞으로도 많은 가르침 부탁 드립니다!!!!

  4. guest 2017.09.02 14:55  댓글주소  수정/삭제  댓글쓰기

    제가 지금까지 제가 설명 중에 가장 잘 정리되어있네요. 많이 도움받고 갑니다. 공부를 정말 열심히 하시나봐요.

  5. orange 2018.01.21 16:31  댓글주소  수정/삭제  댓글쓰기

    진짜 설명 기초부터 잘 해주셔서 많이 배우고 갑니다!!! 너무 감사드려요 ㅎㅎㅎ

  6. 감사합니다 2018.04.13 08:31  댓글주소  수정/삭제  댓글쓰기

    진짜 이렇게 깔끔한 순서와 친절한 설명이... 감사합니다!

  7. 감사합니다. 2018.04.15 22:12  댓글주소  수정/삭제  댓글쓰기

    감사합니다^^ 혹시 오프라인 강의도 하시나요?

  8. 박수환 2018.08.06 03:08  댓글주소  수정/삭제  댓글쓰기

    쌤, 진짜 막혀있던 혈이 풀리는 포스팅입니다 ㅜㅜ
    독학하다가 어딘가 알게 모르게 혼란에 빠지곤 했는데, 구조와 유형의 의미를 명확히 알게 되었습니다.
    이 포스팅은 정말 막힐때마다 와서 개념잡기용으로 다시 봐야겠어요.
    정말 감사합니다!!

  9. soulspasm 2020.02.04 09:04 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 너무 유용한 글 잘 보고 있습니다.
    임의의 데이터프레임을 만들고 여기에 열을 추가할 때 경고가 뜨고 df[4,2]가 NA로 반환되는 원인이 무엇일까요?
    R에서 제공하는 iris 데이터프레임에 열을 추가할 때는 문제가 없습니다.

    > df <- data.frame(col1=c(1,2,3), col2=c("Rabbit", "Eagle", "Wolf"))
    > df
    col1 col2
    1 1 Rabbit
    2 2 Eagle
    3 3 Wolf
    > newRow <- list(4, "Bear")
    > df <- rbind(df, newRow)
    Warning message:
    In `[<-.factor`(`*tmp*`, ri, value = "Bear") :
    invalid factor level, NA generated
    > df
    col1 col2
    1 1 Rabbit
    2 2 Eagle
    3 3 Wolf
    4 4 <NA>

    • R Friend Rfriend 2020.02.04 11:24 신고  댓글주소  수정/삭제

      안녕하세요 soulsasm님,

      아래의 코드처럼 newRow를 DataFrame으로 만들어서 rbind를 실행하면 문제없이 합칠 수 있을 것입니다.

      newRow <- data.frame(col1=4, col2="Bear")
      df <- rbind(df, newRow)