※ 이 카테고리의 글들은 데이터 분석을 위해 Python을 주로 배우고 사용하던 사람이 R을 사용하게 되면서 프로그래밍 방식의 차이로 겪는 불편함을 해결하는 데 목적을 두고 있습니다.
1. 개요
질문
R의 Vector 등과 같은 자료 구조에서, 특정 위치부터 끝까지 인덱싱을 편하게 하는 방법이 있을까요? Python을 예로 들면, 아래와 같이 List 자료 구조에서는 3번째 요소부터 끝까지 인덱싱하려면 아래와 같이 [2:]과 같이 처리하면 됩니다. 즉, 시작점만 밝혀주면 되고 끝 위치는 따로 알려줄 필요가 없습니다.
py_list = [1,2,3,4,5,6,7]
py_list[2:] # 세번째 요소부터 끝까지
하지만 R에서는 이렇게 인덱싱하면 오류가 발생합니다. R에서는 Python과 유사한 방식으로 특정 위치부터 끝까지 인덱싱을 간편하게 하는 방법이 없을까요?
답변
R에서는 이런 방식으로 인덱싱이 불가능합니다. R에서는 1) 여집합의 개념을 활용하여 불필요한 인덱스를 제외하는 방식을 사용할 수 있습니다.
r_vector <- c(1,2,3,4,5,6,7)
r_vector[-(1:2)]
또는 2) 가장 끝 인덱스를 명확하게 전달하는 방식을 사용합니다. 가장 끝 인덱스는 일반적으로 자료구조의 길이가 됩니다.
r_vector <- c(1,2,3,4,5,6,7)
r_vector[3:length(r_vector)]
2. 사례 설명
문제 상황
아래와 같은 형태의 Excel 파일이 있습니다. 데이터 분석에 필요한 데이터만 분리하기 위해, 3번째 열을 포함하여 마지막 열까지 잘라내는 작업이 필요합니다. 이 때, 인덱싱을 어떻게 해야할까요?
Python에서...
Python에서 Pandas를 사용했다면, 아래와 같은 코드가 하나의 방법이 될 겁니다.
import pandas as pd
raw_df = pd.read_excel("./data.xlsx")
raw_df.iloc[:,2:]
파일을 DataFrame으로 읽어들인 다음, iloc을 이용해 인덱싱할 위치를 정했습니다. 여기에서는 열을 선택하는 것이므로 행은 전체로 잡아줍니다. 기준이 되는 C열이 3번째 열이니, 인덱스는 2부터 잡아 주면 되고, 이 데이터가 몇 번째 열까지 존재하는지는 알 필요가 없기에 '2:'의 형태로 인덱싱합니다. 직관적이고 편리한 인덱싱 방법입니다.
R에서...
Python과 비교하면 상대적으로 불편하게 인덱싱을 해야 합니다. 먼저 첫번째 방법입니다. 제외할 열을 지정하고 '-'를 사용합니다. 물론 R에서는 인덱스가 1부터 시작한다는 점을 고려하여야 합니다.
raw_df <- read_excel('./data.xlsx')
raw_df[,-(1:2)]
두번째 방법은 끝점에 해당하는 열의 인덱스를 명확하게 알려주는 것입니다.
raw_df[,3:ncol(raw_df)]
여기에서는 열을 기준으로 잘라야 해서 ncol을 사용했는데, dim()을 이용해 차원을 구하는 것도 방법이 될 수 있고, length() 함수도 사용할 수 있을 겁니다. 만약 행을 기준으로 인덱싱해야 한다면 nrow()를 사용할 수도 있겠죠. 자료구조의 종류에 따라, 길이를 알려주는 다양한 함수들이 사용 가능할 것입니다.