05-03 07:38
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[Data Mining with R Programming] 데이터 입력과 데이터 불러오기 기본 본문

Data Science/Data Mining with R Programming

[Data Mining with R Programming] 데이터 입력과 데이터 불러오기 기본

cinema4dr12 2014. 2. 27. 00:23

[데이터 직접 입력하기]

R에서 데이터 입력의 가징 기본적인 것은 "c" 명령을 통해 사용자가 데이터를 직접 입력하는 것이며 다음과 같은 형식으로 입력한다:

test.name = c(item.1, item.2, item.3, item.n)

예를 들면, 다음과 같이 데이터를 입력할 수 있다. (반드시 아이템과 아이템 사이는 콤마(,)로 구분 짓는다)

> myData = c(1,3,2,5,10) > myData [1] 1 3 2 5 10

앞의 예는 숫자 데이터에 관한 것이었다. 만약 문자열 아이템을 데이터로 저장하려면 다음과 같이 따옴표 형식으로 입력한다:

test.text = c(“item1”, “item2”, ‘item3’)

예를 들어,

> myData = c("dog", "pig", "cat", "horse") > myData [1] "dog" "pig" "cat" "horse"

와 같이 입력한다. 만약 데이터 아이템에 문자열과 숫자 아이템이 혼합될 경우 숫자 아이템은 자동적으로 문자열 아이템으로 변환된다. 즉,

> myData1 = c(1, 3, 5, 7, 9) > myData2 = c("a", "b", "c", "d") > myData = c(myData1, myData2) > myData [1] "1" "3" "5" "7" "9" "a" "b" "c" "d"

데이터를 직접 입력하는 방법은 "c" 명령 이외에 "scan" 명령을 이용하는 방법이 있다.

> myData3 = scan() 1: 2 4 3 5 3 6: 2 3 2 9: Read 8 items > myData3 [1] 2 4 3 5 3 2 3 2

"scan"은 기본적으로 실수형(real) 데이터를 입력 받는데, 만약 문자열을 데이터로 입력하려면 다음과 같이 what = 'character' 속성을 부여한다:

> myData4 = scan(what = 'character') 1: "gchoi" 2: "jmpark" 3: "jkwak" 4: "tjkwak" 5: "dwseo" 6: Read 5 items > myData4 [1] "gchoi" "jmpark" "jkwak" "tjkwak" "dwseo"

만약 콤마 ','를 이용하여 데이터를 구분하려면 다음과 같이 구분자(separator)를 정의한다:

> myData5 = scan(sep = ',') 1: 43,52,34,22,8,54 7: 2,3,4,5 11: Read 10 items > myData5 [1] 43 52 34 22 8 54 2 3 4 5

구분자를 반드시 콤마를 써야하는 것은 아니며 sep 값을 임의로 지정할 수 있다. 예를 들어, 숫자 '6'을 구분자로 정의하면 다음과 같은 결과를 얻을 수 있다:

> myData6 = scan(sep = '6') 1: 36264562346 6: Read 5 items > myData5 [1] 43 52 34 22 8 54 2 3 4 5

"scan"의 속성은 여러가지를 동시에 부여할 수 있다. 예를 들어,

> myData6 = scan(sep = ',', what = 'character')

과 같이 정의할 수 있다.




[파일로부터 데이터 불러오기]

R이 데이터를 직접 입력할 수 있는 명령을 제공한다고 하더라도 R의 콘솔 상에서 데이터를 직접 입력하는 일은 거의 없을 것이다. 실무에서 경험하는 데이터 분석 및 처리 업무의 99.999%는 파일 등의 데이터 소스로부터 데이터를 불러오는 일일 것이다.

우선 현재 각자의 working directory가 어디로 설정되어 있는지 확인해 본다.

> getwd() [1] "/Users/kimho-shup"

각자의 OS에 따라 약간씩 디렉터리 표현 형식은 차이가 있을 것이다. 만약 working directory를 변경하고자 한다면 다음의 형식으로 입력한다.

setwd('pathname')

현재 working directory의 파일을 확인하려면 다음과 같이 입력한다(DOS 명령과 거의 같다):

> dir(getwd()) [1] "EXAMPLE_001_2006_BIRTH_DATA.txt" "EXAMPLE_002_ALUMNI_DONATIONS.txt"

만약 숨김 파일도 표시되도록 하려면

> dir(getwd(), all.files=TRUE) [1] "." ".." "EXAMPLE_001_2006_BIRTH_DATA.txt" "EXAMPLE_002_ALUMNI_DONATIONS.txt"

과 같이 "all.files=TRUE" 속성을 정의하여 입력한다.

이제 본격적으로 파일로부터 데이터를 불러오는 법을 알아보자. 우선 working directory 내에 다음이 파일이 있다고 하자.

FILENAME: 'numbers.txt' :

1, 12, 42, 634, 645, 32

데이터는 각각 ','로 구분되어 있으므로, 파일을 scan할 때 반드시 "sep"에 대한 정의를 지정해야 한다. 즉,

> myData9 = scan(file='numbers.txt', sep=',') Read 6 items > myData9 [1] 1 12 42 634 645 32

과 같은 결과를 얻을 수 있다.

만약 숫자대신 문자열로 된 파일을 읽으려면 "what" 속성을 'char'로 정의하면 된다. 

FILENAME: 'weekdays.txt' :

'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'

주의할 점은, 각 문자열 데이터는 이중따옴표(double quotation mark, "...")가 아닌 단일따옴표('...')로 묶여있어야 한다는 것이다. 이중따옴표로 되어 있으면 R에서 데이터를 읽는데 실패할 것이다. 다음과 같이 입력하면 문자열 데이터를 읽을 수 있다:

> myData10 = scan(file='weekdays.txt', what='char', sep=',') Read 7 items > myData10 [1] "Sun" " Mon" " Tue" " Wed" " Thu" " Fri" " Sat"




[CSV 파일로부터 데이터 불러오기]

CSV 파일은 "comma-separated values"의 약자 말 그래도 콤마(,)로 분리된 값들로 이루어진 데이터 파일을 의미하며, Microsoft의 EXCEL과 같은 테이블 형식을 가지고 있다.

CSV 파일을 읽는 명령은 "read.csv()"이며, 다음과 같은 함수 원형을 갖는다:

read.csv(file, header = TRUE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "", ...)

이 중 주요 파라미터를 살펴보도록 하겠다. "file"은 앞서 살펴보았던 바와 같이 파일의 경로 + 파일명이다. 만약 파일명만 기입하면 현재 working directory에서 파일을 찾을 것이며, 다른 디렉터리에 파일이 있다면 전체 경로를 함께 지정하면 된다. "header=TRUE"일 경우 CSV 파일의 첫번째 행을 읽으며 생략될 경우 기본값은 TRUE이다. "row.names"는 데이터에 대한 행의 이름을 지정할 수 있다.

이제 실제 예를 하나 들어 설명하도록 하겠다. 우선 다음과 같이 CSV 데이터 파일이 준비되었다고 하자:

ID,Age,Employment,Education,Marital,Occupation,Income,Gender,Deductions,Hours,RISK_Adjustment,TARGET_Adjusted 1004641,38,Private,College,Unmarried,Service,81838,Female,0,72,0,0 1010229,35,Private,Associate,Absent,Transport,72099,Male,0,30,0,0 1024587,32,Private,HSgrad,Divorced,Clerical,154676.74,Male,0,40,0,0 1038288,45,Private,Bachelor,Married,Repair,27743.82,Male,0,55,7298,1 1044221,60,Private,College,Married,Executive,7568.23,Male,0,40,15024,1 1047095,74,Private,HSgrad,Married,Service,33144.4,Male,0,30,0,0 1047698,43,Private,Bachelor,Married,Executive,43391.17,Male,0,50,22418,1 1053888,35,Private,Yr12,Married,Machinist,59906.65,Male,0,40,0,0 1061323,25,Private,Associate,Divorced,Clerical,126888.91,Female,0,40,0,0 1062363,22,Private,HSgrad,Absent,Sales,52466.49,Female,0,37,0,0 1068642,48,Private,College,Divorced,Service,291416.11,Female,0,35,0,0 1071615,60,Private,Vocational,Widowed,Clerical,24155.31,Male,0,40,0,0 1071878,21,Private,College,Absent,Service,143254.86,Female,0,35,0,0 1077831,21,Private,College,Absent,Machinist,120554.81,Male,0,40,0,0 1084870,50,Private,Master,Married,Executive,34919.16,Male,0,40,7298,1 1085176,37,Private,HSgrad,Divorced,Executive,67176.79,Male,0,35,0,0 1093662,30,Consultant,HSgrad,Divorced,Repair,9608.48,Male,0,40,0,0 1094029,32,Private,HSgrad,Married,Machinist,12475.84,Male,0,40,0,0 1099084,65,SelfEmp,College,Married,Sales,32963.39,Male,0,40,0,0 1099829,28,Private,College,Married,Executive,31534.97,Male,0,55,0,0 1110947,40,PSLocal,Vocational,Divorced,Executive,182165.08,Female,0,40,0,0 1113899,41,PSState,Bachelor,Divorced,Executive,70603.7,Male,0,40,0,0 1126025,30,Private,HSgrad,Absent,Service,88125.97,Male,0,30,0,0 1129687,38,Private,HSgrad,Married,Repair,8670.9,Male,0,40,0,0 1133761,23,Private,Yr11,Unmarried,Professional,260405.44,Male,0,35,0,0

위의 CSV 파일이름은 "audit.csv"로 지정하였다. "read.csv()" 명령을 이용하여 "audit.csv" 파일을 불러내고 "audit"이라는 변수에 저장한 후, 1에서 5행까지의 데이터를 출력하였다:

> audit = read.csv(file='audit.csv', header=TRUE) > audit[1:5,] ID Age Employment Education Marital Occupation Income Gender Deductions Hours RISK_Adjustment TARGET_Adjusted 1 1004641 38 Private College Unmarried Service 81838.00 Female 0 72 0 0 2 1010229 35 Private Associate Absent Transport 72099.00 Male 0 30 0 0 3 1024587 32 Private HSgrad Divorced Clerical 154676.74 Male 0 40 0 0 4 1038288 45 Private Bachelor Married Repair 27743.82 Male 0 55 7298 1 5 1044221 60 Private College Married Executive 7568.23 Male 0 40 15024 1

만약 테이블 형식으로 데이터를 읽으려면 "read.table()" 명령을 사용하며 "read.csv()"와 거의 동일한 파라미터를 가지고 있다:

> audit = read.table(file='/Users/kimho-shup/Documents/WebApp/Examples/R/DataExercises/audit.csv') > audit[1:5,] [1] ID,Age,Employment,Education,Marital,Occupation,Income,Gender,Deductions,Hours,RISK_Adjustment,TARGET_Adjusted [2] 1004641,38,Private,College,Unmarried,Service,81838,Female,0,72,0,0 [3] 1010229,35,Private,Associate,Absent,Transport,72099,Male,0,30,0,0 [4] 1024587,32,Private,HSgrad,Divorced,Clerical,154676.74,Male,0,40,0,0 [5] 1038288,45,Private,Bachelor,Married,Repair,27743.82,Male,0,55,7298,1 2001 Levels: 1004641,38,Private,College,Unmarried,Service,81838,Female,0,72,0,0 ... ID,Age,Employment,Education,Marital,Occupation,Income,Gender,Deductions,Hours,RISK_Adjustment,TARGET_Adjusted

만약 파일을 직접 선택하려면 "file.choose()"를 사용한다:

testData = read.csv(file.choose())

명령을 실행하면, 파일을 선택할 수 있도록 Finder(Mac) 또는 Explorer(Windows) 창이 열릴 것이다.

CSV가 기본적으로 콤마로 구분되는 데이터 파일이라 하더라도 경우에 따라서 콤마가 아닌 탭 이나 스페이스 등으로 구분되는 경우가 있다. 만약 탭으로 데이터가 구분되어 있다면 " sep = '\t' "를 속성을 정의한다.




[데이터 파일의 유실 데이터]

실무에서 통계분석 업무를 하다보면 보통 연습용으로 사용하는 예제 데이터와 같이 빈 곳 없는 네모 반듯한 테이블 형식의 데이터 파일이 아닌 중간중간 비어 있는 데이터 파일을 다뤄야 할 때가 다반사이다. 이러한 데이터 파일을 읽을 때 R은 데이터를 깔끔한 네모 반듯한 테일블 형식으로 재정리하며 빈 곳을 "NA"라는 값으로 채운다. NA는 "Not Applicable" 또는 "Not Available"의 약자 정도로 생각하면 된다. NA가 포함된 데이터 분석에 대해서는 차후 R을 이용한 실전 데이터 분석에 대한 주제를 다룰 때 다시 한 번 언급하도록 하겠다.

Comments