ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [R][Tutorial] R 초보자를 위한 튜토리얼 데이터 타입 및 구조
    개발 이야기/R 2025. 4. 18. 16:34

    R을 너무 오랜만에 쓰는 관계로 간단하게 아래의 튜토리얼을 따라해보려고한다. 

    https://misdb.github.io/R/R-Tutorial/

     

    index

    초보자를 위한 R 튜토리얼 요약 R은 데이터 과학자나 구글, 에어비엔비, 페이스북 등과 같은 주요 기업들이 데이터 분석을 위해 널리 이용하고 있는 프로그램 언어이다. 이 사이트는 초보자를 위

    misdb.github.io

     

    R 프로그램

    R은 통계계열에서 많이 사용하는 언어로 1993년에 Ross Ihaka와 Robert Gentleman이 개발하였다. R은 광범위한 통계와 그래픽 메소드(method)를 보유하고 있다. 기계학습 알고리즘, 선형 회귀분석, 시계열 분석, 통계적 추론 등과 같은 몇 가지 예를 들 수 있다. 

    R 데이터 타입

    데이터 타입은 복잡하게 생각하지 말고 아래의 3개 numeric, char, logical(bool)이 존재한다고 생각하면되다. 

    x = 3       # numeric (double)
    y = "hi"    # character
    z = TRUE    # logical확인

     

    Vector와 List

    Vector의 경우 c()를 이용한다.

    v <- c(1, 2, 3)          # numeric vector
    typeof(v)               # "double"

     

    List의 경우 list()를 이용한다. 

    lst <- list(1, "a", TRUE)
    typeof(lst)         # "list"
    str(lst)            # List of 3: num 1, chr "a", logi TRUE

     

    이때 둘의 차이점은 list의 경우 여러 데이터타입을 담을 수 있다는 것이다. 

    결국 vector는 np.array랑 비슷하다고 생각하면된다.

    범주형 변수 factor

    범주형변수의 경우 factor를 이용한다. 

    Factor의 경우 다음과 같이 사용한다. 

    gender <- factor(c("male", "female", "male", "female"))
    gender
    # [1] male   female male   female
    # Levels: female male

     

    내부적으로 숫자와 level의 구조로 되어있다. 

    즉 숫자는 각 데이터들이 어느 범주에 속하는지를 나타내며, levels는 그 숫자들이 무얼 의미하는지를 담는다. 

    as.integer(gender)     # [1] 2 1 2 1
    levels(gender)         # [1] "female" "male"

     

    기본적으로 범주는 order가 없지만 order가 존재하는 경우, order ture옶션을 주면 된다. 

    grade <- factor(c("B", "A", "C", "B"),
                    levels = c("C", "B", "A"),
                    ordered = TRUE)
    grade[1] > grade[3]   # TRUE (B > C)

     

    마지막으로 factor의 값들을 불러올때, 바로 as.numeric을 하면 레벨의 인덱스들을 불러오기에 실제 값을 불러오려면 char로 변환하고 numeric으로 다시 변환하자. 

    f <- factor(c("100", "200", "300"))
    
    as.numeric(f)                 # [1] 1 2 3 ❌ 잘못된 변환
    as.numeric(as.character(f))  # [1] 100 200 300 ✅ 올바른 변환

     

    Matrix

    Matrix의 경우 다음과 같이 정의한다.

    matrix(data, nrow, ncol, byrow = FALSE)

     

    이때 인자의 경우 

    • data: 행렬의 행과 열에 정렬될 요소들의 집합.
    • nrow: 행의 수
    • ncol: 열의 수
    • byrow: 행 우선으로 데이터가 왼쪽에서 오른쪽 방향으로 채워진다. 열 우선으로 행렬의 값을 채우고 싶다면 즉, 데이터가 열 우선으로 위에서 아래로 채워지게 하고 싶다면 byrow = FALSE (기본 값)를 사용한다.이다. 
    # 2행 3열 행렬 (by column이 기본)
    m <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, ncol = 3)
    print(m)
         [,1] [,2] [,3]
    [1,]    1    3    5
    [2,]    2    4    6

     

    행렬에 행추가나 열추가의 경우 rbind(), cbind()를 이용한다. 

     

    Dataframe: matrix형태지만 다른 타입이 가능

    특징 matrix data.frame
    타입 통일 여부 ✅ 모든 원소 같은 타입 (numeric 등) ❌ 열마다 다른 타입 가능
    내부 구조 atomic vector + dim 속성 리스트 (각 열이 벡터)
    사용 목적 수치 계산, 행렬 연산 통계 분석, 데이터 처리
    열 이름 colnames() names() 또는 colnames()
    행 이름 rownames() rownames()
    출력 형태 깔끔한 배열 테이블 느낌, 열 이름 출력
    엑셀 같은 데이터

     

    dataframe의 경우 표에서 나타난것처럼 matrix형태지만 열마다 다른타입이 가능하다(이는 기존 python에서 다룬것과 유사)

    df <- data.frame(
      name = c("Alice", "Bob", "Charlie"),
      age = c(25, 30, 28),
      student = c(TRUE, FALSE, TRUE)
    )

     

    구조는 다음과 같이 str로 확인가능. 

    str(df)
    # 'data.frame':	3 obs. of  3 variables:
    # $ name   : chr  "Alice" "Bob" "Charlie"
    # $ age    : num  25 30 28
    # $ student: logi  TRUE FALSE TRUE

     

    주의할 점은 data.frame의 경우 문자열은 자동으로 factor로 변환하는 경우가 있기에 이를 주의하자. 

    data.frame(name = c("a", "b"), stringsAsFactors = FALSE)

     

    데이터프레임에 열을 추가하려면 다음과 같이 $를 이용해 새로운 변수와 함께 추가하자. 

    # Create a new vector
    quantity <- c(10, 35, 40, 5)
    ​
    # Add `quantity` to the `df` data frame
    df$quantity <- quantity
    df

     

    행을 추가하는 경우 rbind()를 이용하자

    # 기존 데이터프레임
    df <- data.frame(name = c("Alice", "Bob"), age = c(25, 30))
    
    # 추가할 행 (벡터 또는 data.frame 형태)
    new_row <- data.frame(name = "Charlie", age = 28)
    
    # 행 추가
    df <- rbind(df, new_row)
    
    #or vector로 추가
    new_row <- c("David", 22)
    df <- rbind(df, new_row)

     

    반복추가인 경우 다음처럼 list를 받는 do.call를 이용하다. 

    rows <- list()
    rows[[1]] <- data.frame(name = "Eve", age = 21)
    rows[[2]] <- data.frame(name = "Frank", age = 26)
    
    df <- rbind(df, do.call(rbind, rows))

     

    do.call의 경우 함수 호출을 리스트로 표현된 인자들로 실행하는 함수이다. 

     

     

Designed by Tistory.