R 은 숫자형 벡터를 처리할 수 있는 편리한 함수를 다수 제공합니다.

 

이번 포스팅에서는 절대값 계산, 제곱근 계산, x 보다 크거나 같은 정수(지붕), x 보다 작거나 같은 정수(바닥), 소수점 이하는 잘라서 버리거나 반올림 하기, 로그 변환, 지수 변환, 팩토리얼 등의 벡터 처림 함수에 대해서 알아보도록 하겠습니다. 

 

문자형 벡터 처리 함수는 나중에 별도로 기회를 봐서 포스팅하도록 하겠습니다.

 

 

R 숫자형 벡터 처리 함수 

 

 

1) 절대값 계산 : abs(x)

 

> abs(10)
[1] 10
> abs(-10)
[1] 10

 

 

2) 제곱근 계산 : sqrt(x)

 

> sqrt(16) [1] 4 > sqrt(-16) # 허수는 NaN [1] NaN Warning message: In sqrt(-16) : NaNs produced

 

 

3) x 보다 크거나 같은 정수 (지붕 정수) : ceiling(x)

 

> ceiling(5.88)
[1] 6
> ceiling(6.00)
[1] 6

 

 

4) x 보다 작거나 같은 정수 (바닥 정수) : floor(x)

 

> floor(5.88)
[1] 5
> floor(5.00)
[1] 5

 

 

5) x 소숫점 이하는 잘라서 버림 : trunc(x)

 

> trunc(5.88)
[1] 5
> trunc(5.10)
[1] 5

 

 

6) x 를 소수점 n자리로 반올림 : round(x, digits=n)

 

> round(5.88, digits = 1)
[1] 5.9
> round(5.88, digits = 0)
[1] 6
> round(5.10, digits = 0)
[1] 5

 

 

7) x 를 밑이 n인 log 취하기 : log(x, base=n)

 

> log(10, base=2) # 밑이 2인 로그 [1] 3.321928 >

> log(10, base = exp(1)) # 자연로그 [1] 2.302585 >

> log(10) # 자연로그, base = exp(1) 을 생략해도 동일함 [1] 2.302585 >

> log(10, base=10) # 밑이 10인 상용로그 [1] 1 >

> log10(10) # 상용로그의 다른 표현법 [1] 1 

 

 

8) x 를 지수변환하기 : exp(x)

 

> exp(log(10, base=exp(1)))
[1] 10
> exp(1)
[1] 2.718282
> exp(10)
[1] 22026.47 

 

 

9) x factorial : factorial(x)

 

> factorial(2)
[1] 2
> factorial(3)
[1] 6
> factorial(4)
[1] 24
> factorial(5)
[1] 120 

 

 

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

 

728x90
반응형
Posted by Rfriend
,

R에서 데이터를 입력할 때 c() 를 사용하는데요, 일정한 반복이나 규칙을 따르는 데이터 입력이라면 함수 명령문을 이용하는게 단순 업무를 줄이는 방법이 되겠지요.

 

예전에 R의 장점이자 강점 중의 하나가 벡터 연산이 파워풀하다는 점이라고 했는데요,

 

아래의 rep(), seq() 함수를 곁들여서 벡터 연산에 활용하면 좋겠지요?!

 

 

 

 rep(), seq() 반복 데이터, 일정한 구조/순차 데이터 생성

 

 

(1) rep() : 일정한 데이터 반복

 

반복하고자 하는 4가지 형태별로 아래 예시를 들었습니다.

 


> ## "a"를 10번 반복

> rep("a", times = 10) [1] "a" "a" "a" "a" "a" "a" "a" "a" "a" "a" >

> ## "1"을 15번 반복

> rep(1, times = 15) [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 # 1 은 숫자형 그대로 임 >

> ## ("a" & "1") 을 5번 반복

> rep( c("a", 1), 5) [1] "a" "1" "a" "1" "a" "1" "a" "1" "a" "1" # "1"이 숫자형이 아니라 문자형으로 변환됨 >

> ## "a"를 먼저 5번 반복하고, "1"을 10번 반복

> rep( c("a", 1), c(5,10))
 [1] "a" "a" "a" "a" "a" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1"

 

 




특정 범위의 정수 숫자를 각각 동일한 횟수로 반복하고자 한다면 rep(x:y, each=z) 함수를 사용하면 편합니다.

1~3까지의 정수를 10번씩 반복하는 예제는 아래와 같습니다.



> # repeat 1 at 10 times, 2 at 10 times, 3 at 10 times
> rep(1:3, each=10)
 [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3

 




1행부터 20행까지 있는 데이터 프레임에서 1부터 5까지의 반복하는 숫자를 행 기준으로 반복하는 예제는 아래와 같습니다. dataframe$var <- rep(c(1:5), len = ncol(dataframe)) 처럼 할당하는 방법도 있고, cbind()를 사용하는 방법도 있는데요, 2가지 방법 모두 아래에 소개하였습니다. 진동, 주파수 처럼 일정한 주기성을 띠는 데이터를 분석하는 경우 분석 단위/구간 지정을 위해서 은근히 많이 사용하는 데이터 전처리 방법입니다.



> ## rep() exmaple
> x <- c(1:20)
> y <- rep(1, times = 20)
> z <- rep(c(1, 2), c(10, 10))
> xyz <- data.frame(cbind(x, y, z))
> xyz
    x y z
1   1 1 1
2   2 1 1
3   3 1 1
4   4 1 1
5   5 1 1
6   6 1 1
7   7 1 1
8   8 1 1
9   9 1 1
10 10 1 1
11 11 1 2
12 12 1 2
13 13 1 2
14 14 1 2
15 15 1 2
16 16 1 2
17 17 1 2
18 18 1 2
19 19 1 2
20 20 1 2
> 
> ## repeating c(a:b) from first row until last row : way 1
> xyz$seq_no_1 <- rep(c(1:5), len = nrow(xyz))
> xyz
    x y z seq_no_1
1   1 1 1        1
2   2 1 1        2
3   3 1 1        3
4   4 1 1        4
5   5 1 1        5
6   6 1 1        1
7   7 1 1        2
8   8 1 1        3
9   9 1 1        4
10 10 1 1        5
11 11 1 2        1
12 12 1 2        2
13 13 1 2        3
14 14 1 2        4
15 15 1 2        5
16 16 1 2        1
17 17 1 2        2
18 18 1 2        3
19 19 1 2        4
20 20 1 2        5
> 
> ## repeating c(a:b) from first row until last row : way 2
> seq_no_2 <- rep(c(1:5), len = nrow(xyz))
> xyz <- cbind(xyz, seq_no_2)
> xyz
    x y z seq_no_1 seq_no_2
1   1 1 1        1        1
2   2 1 1        2        2
3   3 1 1        3        3
4   4 1 1        4        4
5   5 1 1        5        5
6   6 1 1        1        1
7   7 1 1        2        2
8   8 1 1        3        3
9   9 1 1        4        4
10 10 1 1        5        5
11 11 1 2        1        1
12 12 1 2        2        2
13 13 1 2        3        3
14 14 1 2        4        4
15 15 1 2        5        5
16 16 1 2        1        1
17 17 1 2        2        2
18 18 1 2        3        3
19 19 1 2        4        4
20 20 1 2        5        5

 

 



(2) seq() : 일정한 구조/순차 데이터 생성

 

 아래 예시를 참고하세요.

 

 

> ## c()를 이용한 1부터 10까지 입력 (1 단위씩 커짐)
> c(1:10)
 [1]  1  2  3  4  5  6  7  8  9 10
> 
> ## seq()를 이용한 1부터 10까지 입력 (1 단위씩 커짐)
> seq(from=1, to=10)
 [1]  1  2  3  4  5  6  7  8  9 10
> 
> ## seq_len()을 이용한 1부터 10까지 입력 (1 단위씩 커짐)
> seq_len(10)
 [1]  1  2  3  4  5  6  7  8  9 10
> 
> ## seq()를 이용한 1~10까지의 숫자를 2단위씩 증가시키면서 입력
> seq( from = 1, to = 10, by=2 )  # from, to 는 제외해도 괜찮음
[1] 1 3 5 7 9
> 
> ## seq()를 이용한 1~10까지의 수를 5개의 숫자로 등간격으로 구성 (숫자는 5개, 구간은 4개)
> seq( 1, 10, length = 5 )  # from, to 는 제외해도 괜찮음
[1]  1.00  3.25  5.50  7.75 10.00
> 
# length.out : 개수 지정
> seq(from = 1, by = 2, length.out = 10)
 [1]  1  3  5  7  9 11 13 15 17 19

 

 

 

 

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

 

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

 

728x90
반응형
Posted by Rfriend
,

엑셀에서 외부 텍스트 데이터를 불러올 때 (1) ',', ':', ' ' 등의 구분자로 column을 구분하는 방식이 있고, (2) 일정한 간격, 고정된 폭으로 되어 있어서 대화상자에서 구분하는 폭/선을 마우스로 지정해주는 방식이 있습니다.

 

R에서 (1) 구분자가 들어있는 외부 텍스트 파일 불러오기는 지난번 포스팅에서 read.table(), read.csv() 함수를 소개했는데요,

 

이번 포스팅에서는 (2) 고정된 폭의 외부 텍스트 파일을 불러오는 함수 read.fwf() 함수에 대해 알아보겠습니다.

 

 

read.fwf() : 일정한 간격, 고정된 폭 구조의 외부데이터 불러오기

 

fwf 는 fixed width file 의 약자입니다.

아래 예제를 보면서 따라해보면 금방 사용법 알 수 있을 거예요.

 

 아래 형태처럼 1~2자리, 3~5자리, 6~8자리로 일정한 간격으로 되어있는 데이터를 불어와보도록 하겠습니다.


data_fwf.txt


 

 

read.fwf("디렉토리 경로",

       widths = c(간격 설정),

        col.names = c(변수명 설정))

 

> # fwf() 함수로 일정한 간격 외부 텍스트 데이터 불러오기

> data_fwf <- read.fwf("C:/Users/user/Documents/R/data_fwf.txt", # 경로 '/' 주의 + widths = c(2,3,3), + col.names = c("Var_1", "Var_2", "Var_3"))

 

 

불러온 데이터를 확인해 보면, col.names에서 할당한 변수명대로 해서 일정한 간격으로 구분되어 데이터가 들어가 있음을 알 수 있습니다.

 

> data_fwf
  Var_1 Var_2 Var_3
1    11   aaa   222
2    33   bbb   444
3    55   ccc   666

 

구분자를 안쓰는 경우 자칫 중간에 데이터가 꼬일 수 있으므로 read.fwf() 함수는 조심해서 써야 합니다. 기계에서 일정한 간격으로 흐트러짐 없이 쏟아져나오는 센서 데이터와 같이 일정한 간격, 고정된 구조의 데이터라고 확신이 있을 때만 사용하시기 바랍니다.

 

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

 

728x90
반응형
Posted by Rfriend
,

 

R 데이터 프레임 구조는 분석에 가장 많이 사용하는 구조의 데이터 셋입니다.

 

데이터 프레임의 변수를 활용하는 방법 3가지를 알아보도록 하겠습니다.

 

 

 

 R 데이터 프레임 활성화: with(), attach() & detach()

 

(1) 데이터 프레임 이름$변수명 : 입력할 거리가 몇 개 안되는 경우 적합

 

> ## 데이터 프레임 이름을 지정하지 않으면 R은 어디에서 변수를 가져와야 할지 알지 못함. 에러 발생

> mean(mpg) Error in mean(mpg) : object 'mpg' not found
>
> ## '데이터 프레임 이름$변수명' 형식으로 '$'를 이용해 객체 지정해주어야 R이 이해를 함
> mean(mtcars$mpg) [1] 20.09062 

>
> ## '0-1' 변환 해보기

> tf_0_1 <- (max(mtcars$mpg) - mtcars$mpg) / (max(mtcars$mpg) - min(mtcars$mpg)) > tf_0_1 [1] 0.54893617 0.54893617 0.47234043 0.53191489 0.64680851 0.67234043 0.83404255 0.40425532 [9] 0.47234043 0.62553191 0.68510638 0.74468085 0.70638298 0.79574468 1.00000000 1.00000000 [17] 0.81702128 0.06382979 0.14893617 0.00000000 0.52765957 0.78297872 0.79574468 0.87659574 [25] 0.62553191 0.28085106 0.33617021 0.14893617 0.77021277 0.60425532 0.80425532 0.53191489

* mtcars 는 R base 패키지에 내장된 데이터 프레임으로서, 자동차 32개 브랜드에 대해 11변수 값 조사해 놓은 자료.

str(mtcars) 해보면 데이터 구조, 변수명, 변수 개수, 관찰치 개수, 변수별 상위 데이터셋 미리보기 가능.

 

 

(2) with(데이터 프레임 이름, R 명령문) : R 명령문이 한 줄인 경우에만 사용 가능

 

위의 '$'는 R 명령어를 입력할 때마다 매번 '데이터 프레임 이름$변수명' 처럼 데이터 프레임 이름을 입력해주어야 하므로, 입력해야할 R 명령문이 많아지만 꽤 번거로운 방법이라고 하겠습니다. 모르면 손.발이 고생한다는 말이 딱 맞겠지요.

 

이럴 경우 손.발의 고생을 덜어주기에 유용한 함수가 with() 입니다. 위의 '0-1 변환'을 with()함수를 써서 해보겠습니다.

 

> tf_0_1_2 <- with(mtcars, (max(mpg) - mpg) / (max(mpg) - min(mpg)) )
> tf_0_1_2
 [1] 0.54893617 0.54893617 0.47234043 0.53191489 0.64680851 0.67234043 0.83404255 0.40425532
 [9] 0.47234043 0.62553191 0.68510638 0.74468085 0.70638298 0.79574468 1.00000000 1.00000000
[17] 0.81702128 0.06382979 0.14893617 0.00000000 0.52765957 0.78297872 0.79574468 0.87659574
[25] 0.62553191 0.28085106 0.33617021 0.14893617 0.77021277 0.60425532 0.80425532 0.53191489 

 

(1)번의 '$'를 사용한 노가다보다는 with()함수를 쓰니 훨씬 간결해지고 손도 덜 가지요?

다만, with()함수는 한 줄의 명령어만 가능하다보니 동일 데이터 프레임에 대해서 다수의 R 명령어를 써야 하는 상황이라면 attach(), detach() 함수를 사용해야 합니다.

 

 

(3) 활성화 시작 attach(데이터 프레임 이름), 끝 detach(데이터 프레임 이름): 다수의 R 명령문 입력 시 적합

 

공통적으로 계속 사용되는 대상 데이터 프레임을 지정(활성화 한다고 함)할 때는 attach(), 다른 데이터 프레임으로 바꾸고자 기존의 지정(활성화)된 데이터 프레임을 해제하고자 할때는 detach() 함수를 사용합니다.

 

> ## 데이터 프레임 활성화 attach()

> attach(mtcars) > tf_0_1_3 <- (max(mpg) - mpg) / (max(mpg) - min(mpg)) > tf_0_1_3 [1] 0.54893617 0.54893617 0.47234043 0.53191489 0.64680851 0.67234043 0.83404255 0.40425532 [9] 0.47234043 0.62553191 0.68510638 0.74468085 0.70638298 0.79574468 1.00000000 1.00000000 [17] 0.81702128 0.06382979 0.14893617 0.00000000 0.52765957 0.78297872 0.79574468 0.87659574 [25] 0.62553191 0.28085106 0.33617021 0.14893617 0.77021277 0.60425532 0.80425532 0.53191489 > > hist(mpg)

 

> summary(mpg) Min. 1st Qu. Median Mean 3rd Qu. Max. 10.40 15.42 19.20 20.09 22.80 33.90 >

> ## 데이터 프레임 활성화 해제 : detach() > detach(mtcars)

 

attach(데이터 프레임 이름 mtcars) 이후에 변수 변환도 하고, 히스토그램 그래프도 그리고, summary() 함수로 연비(mpg: mileage per gasolin)의 요약통계량을(최소값, Q1, 중앙값, 평균, Q3, 최대값) 구하는데 있어서 공통적으로 'mtcars' 데이터 프레임을 대상으로 해서 변수를 가져다가 R 함수가 실행되었습니다.

 

만약 '$'문을 사용했더라면 매번 데이터 프레임 이름을 계속 명기해주어야 하므로 노가다 좀 했겠지요? ^^

 

attach() 함수를 사용할 때 주의할 점이 있는데요, 그건 다음번 포스팅에서 다루도록 하겠습니다.

 

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

 

728x90
반응형
Posted by Rfriend
,

아래의 '태풍 찬홈 실제 이동 경로, 미 예보가 정확... 한국이 가장 빗나가' 신문 기사와 관련하여, 생각나는 것들 몇가지 적어봅니다. 

 

제대로 조사하고 정리하자면 일이 되어 차일피일 미루다가 글을 못쓰게 되곤 하야, 이슈가 될 때 짧고 굷게 휘갈겨 적어봅니다.

 

 

 

 

 

* 신문기사 출처: http://news.chosun.com/site/data/html_dir/2015/07/13/2015071300191.html

 2015.07.13, 박은호 기자, 조선일보

 

 


 

 

 

(1) 기상 예측, 쉽지만은 않다.

 

카오스(Chaos) 이론에 대해서 공부해보신 분들은 아마 접해보셨을 이야기입니다. 기상학자 로렌츠가 간단한 기상모델을 만들어서 컴퓨터로 계산을 해보았다고 합니다. 그러다가 다음날 다시 계산을 해보았는데 그 전날 계산한 값과 매우 큰 차이를 보이길레 모델에 뭐가 잘못되었나 한참을 찾았다고 합니다. 찾다, 찾다 결국 찾아낸 것이 초기 입력값의 소숫점 3째자리(?) 이하의 아주 작은 값을 입력하지 않았더니 예측값이 시간이 지날수록 확연히 달라지더라는 것을 발견하고 깜짝 놀랐다는 이야기 입니다.  

 

 

(위 그림 출처: http://ws.ajou.ac.kr/~nldc/int_xaos.htm   , 아마도 카오스 책 아니면 복잡계 책에서 봤던 그림인데, 책을 다 중고로 팔아버려서 확인할 수는 없고....기억이 잘 안나네요 ^^;)

 

소위 나비효과라고도 많이들 얘기하는데요, 베이징에서 나비가 날개짓하면 뉴욕에서 해일이 발생할 수도 있다는 이야기의 원조가 바로 로렌츠 기상모델 곡선이 되겠습니다.

 

증폭 효과로 인해서 초기의 아주 극히 작은 값에도 민감하게 시간이 지날수록 오차가 커지게 되고, 장기적인 예측은 오차가 벌어질 수밖에 없다는 내용이 되겠습니다. 일기예보, 특히 장기 일기예보는 원래 이렇게 어려운 겁니다. 한국 기상청 너무 욕하지 마시길요. ^^'

 

 

(2) 기상 예측, 그동안 많이 발전하여 왔다.

 

그렇다 하더라도 요즘 아침 출근할 때마다 스마트폰으로, TV뉴스로 일기예보 확인하고 우산 챙기고 다니시죠?  피부로 느끼기에 유용하다고 느끼지 않으시는지요?  지역을 격자로 나누어서 각 지역거점마다 기상 관련 정보를 수집하고, 이를 과거 데이터와 날씨 정보를 활용하여 모델을 만들어서 점점 더 날씨 예측을 정교화해나가고 있습니다.  요즘은 '국지성 기상정보'를 수집/예측해서 돈 주고 파는 사업자까지 나왔습니다. '국지성(기존 보다 더욱 작은 cell로 나누어서) 기상예보'가 가능하고 또 돈이 되니깐 하는 사업이겠지요.

 

 

(3) 기상 예측, 앞으로 더 발전할 여지가 있다.

 

앞으로 날씨 정보를 수집하는 cell을 더욱 작게 하고, 또 3차원 공간으로 축을 하나 더 세워서 cubic 개념으로 정보를 수집하고 예측 모델링을 한다면 (가령, 가정을 해보자면 말입니다. ^^;), 즉, 데이터를 더 촘촘히 수집해서 장기간 축적하고 모델링을 한다면 기상 예측의 정확도도 더욱 높아지겠지요.

 

 

(4) 빅데이터 기술이 큰 역할을 할 것이다.

 

다만, (3)번 처럼 하게 되면 문제가 되는 것이, 데이터 저장을 위한 공간도 기하급수적으로 늘어나고(물론, 저장 비용이 매우 싸지고 있으므로 이건 좀 작은 문제라고 치고...), 더불어서 연산을 위한 IT 비용과 시간도 기하급수적으로 늘어난다는 것이 문제가 되겠습니다.

 

하지만, 요즘 빅데이터의 분산병렬처리 기술을 활용하면 비용효율적으로, 또 매우 빨른 시간 안에 이러한 연산을 처리할 수 있는 환경이 열렸습니다. 예전에는 불가능했던게 이제는 가능하게 된 것이지요.  기상청에서도 아마도 이미 슈퍼컴퓨터를 쓰고 있을 텐데요, 앞으로 더욱 싼 비용으로 더욱 파워풀한 슈퍼컴퓨터를 쓸 수 있게 될겁니다.

 

 

(5) 확률로 제시했더라면 좋았을 것을... 단기예측은 정확하지만 장기로 갈수록 불확실...

 

한국 기상청에서 이번에 미.일.중 기상청 대비 찬홈 태풍 이동경로 예측 정확도가 꼴찌이다 보니 여론의 뭇매를 맞는 것이겠지요. 한국 기상청에서 태풍 찬홈의 이동 경로를 몇 개의 경로를 제시하고 각 예상 경로별로 확률로 제시를 했더라면 더 좋았을 텐데 싶습니다. (1)번 로렌츠 기상모델 곡선에서 얘기했지만, 단기 예측 대비 장기 예측으로 갈 수록 불확실성이 증폭(!)되다 보니 하나님이 아닌 이상은 정확하게 예측하는게 매우 매우 매우 힘들다는 것을 인정하는게 맞다고 보며, 결국 확률로 제시할 수밖에 없고, 시간이 지나면서 계속 새로 들어온 정보를 가지고 예측을 update해주는 수밖에 없다고 생각합니다.

 

그래야, 최악의 시나리오의 가능성에 대해서도 사람들이 생각해볼 여지를 줄 수 있고, 또 대비할 수 있는 생각을 해볼 여지도 줄 수 있는거 아닐까요?  기상청에서 한국 말고 중국쪽으로 멀리 돌아서 태풍이 지나간다고 단정적으로(? 다수 시청자가 이리 받아들이지 않을까요?) 말하는 거랑, 미국이 제시한 코스로도 올 확률이 xx%이다 라고 같이 제시해 주는 거랑은 아마 시청자들이 받아들이는 감이 다를거라고 생각합니다.

 

 

(6) 한.미.일.중 비교를 하려면, 샘플 사이즈를 키워서 비교해달라.

 

마지막으로, 기자분께 한마디 하자면, 한국 기상청이 태풍 찬홈 이동경로 예측에서 미.일.중 대비 꼴찌였다고 했는데요, 한국 기상청의 기상예보 실력을 미.일.중과 비교를 해서 소위 '가설 검증(hypothesis test)'을 해보려면 이번 태풍 찬홈 예보 case 하나만 가지고 한국 기상청을 까기에는 한국 기상청이 좀 억울해 할 것 같습니다. 통계학에서는 보통 샘플 사이즈가 30개 넘으면 중심극한의 정리에 의해 t분포->정규분포로 근사하고, 신뢰수준 xx%, 유의수준 xx% 에서 통계적으로 가설이 유의미한지 아닌지를 검증하지요.

 

기자님께서 최근에 국내에 영향을 끼쳤던 태풍 30개에 대해서 한.미.일.중 기상청 별로 이동 경로를 어떻게 예보를 했었는지, 한.미.일.중 기상청 예보별로 정확도 등수를 매겼을 때 한국 기상청이 다른 나라 기상청보다 우수하다고 할 수 있는지, 평균 수준인지, 아니면 띨띨하다고 할 수 있는지에 대해서 검증을 해보았더라면 한국 기상청이 덜 억울했을 것 같습니다.

 

태풍 찬홈 뒤에 또 다른 태풍이 오고 있다고 하던데요, 한국 기상청이 다음번에는 태풍 경로 예보 잘 맞추시길, 그리고 아무쪼록 농사짖는 분들께 피해가 덜 갔으면 하는 바램으로 이번 포스팅 마칩니다.

 

728x90
반응형
Posted by Rfriend
,

 

R 데이터 객체를 신규로 생성했거나, 외부에서 불러왔거나, 아니면 R 패키지에 내장되어 있는 데이터 셋을 활용한다고 했을 때 데이터 객체의 현황, 특성에 대해서 파악하는 것이 필요합니다.

 

이에 유용한 함수들을 알아보도록 하겠습니다.

 

 

 R 데이터 객체 탐색을 위한 함수 

 

R에 기본으로 내장되어 있는 'mtcars' 라는 데이터 프레임을 가지고 아래의 각 함수들의 예시를 들어보겠습니다.

'mtcars' 데이터는 1974 Motor Trend US magazine에서 자동차 디자인과 성능에 관해 추출한 11개의 변수로 구성된 데이터 프레임입니다.

 

> mtcars
                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2 

 

'mrcars' 라고 콘솔창에 치면 위의 박스 상자에 있는 것처럼 데이터 보기가 가능합니다. 이처럼 데이터 관찰치와 변수가 몇 개 안되면 콘솔창이나 아니면 environment 창에서 데이터셋을 눌러서 미리보기를 할 수 있겠읍니다만, 데이터 관찰치가 몇 백만이 되고 변수도 수천개가 넘는 데이터 객체라면 무리겠지요. 그래서 아래 함수들이 필요합니다.

 

 

(1) str(객체) : 데이터 구조, 변수 개수, 변수 명, 관찰치 개수, 관찰치의 미리보기

 

> str(mtcars)
'data.frame':	32 obs. of  11 variables:
 $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp: num  160 160 108 258 360 ...
 $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ qsec: num  16.5 17 18.6 19.4 17 ...
 $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ carb: num  4 4 1 1 2 1 4 2 2 4 ... 

 

mtcars 가 '32개의 관측치', '11개의 변수'로 되어있는 '데이터 프레임'이고, 각 변수명과 변수들의 유형, 그리고 상위 10개의 관측치가 미리보기 형식으로 제시됩니다. 데이터 셋 탐색을 위해 제일 처음 해보면 좋을 유용한 함수입니다.

 

 

(2) head(), tail() : 상위 6개, 하위 6개 관측치 미리보기

 

> head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1


>
tail(mtcars) mpg cyl disp hp drat wt qsec vs am gear carb Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2 Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.5 0 1 5 4 Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.5 0 1 5 6 Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.6 0 1 5 8 Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.6 1 1 4 2 

 

관측치가 수백만, 수천만 건인 경우는 상위 혹은 하위 몇개만 미리보기를 할 수 있으면 유용하겠지요.

 

 

(3) dim() : 데이터 객체의 차원

 

> dim(mtcars)
[1] 32 11 

 

str() 함수로 파악이 전부 가능한 정보인데요, 데이터 객체의 차원만 알고 싶거나 아니면 데이터 객체의 차원을 벡터로 해서 indexing해서 쓸일이 있을 때 이 함수를 사용하면 되겠지요.

 

 

(4) length() : 데이터 객체의 요소들의 개수

 

> length(mtcars) [1] 11

 

> length(mtcars$mpg)
[1] 32

 

첫번째 length(mtcars) 는 mtcars 데이터셋의 변수들의 개수를,

두번째 lenght(mtcars$mpg)는 mtcars의 데이터셋의 mpg라는 변수의 관측치의 개수를 나타냅니다.

(length()를 벡터에 사용하면 관측치의 개수를 나타냄)

목적에 맞게 골라서 사용하면 되겠습니다.

 

 

(5) names() : 데이터 객체 구성요소 이름

 

> names(mtcars)
 [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear" "carb"

 

데이터 객체의 변수명을 알고 싶고, indexing해서 사용하고 싶으면 names() 함수를 사용하면 되겠습니다.

 

 

(6) class() : 데이터 객체 구성요소의 속성

 

> class(mtcars)
[1] "data.frame"
> sapply(mtcars, class)
      mpg       cyl      disp        hp      drat        wt      qsec        vs        am 
"numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" 
     gear      carb 
"numeric" "numeric" 

 

첫번째의 class(mtcars)는 데이터 객체가 '데이터 프레임'임을 나타내고 있으며,

두번째 sapply(mtcars, class)는 'mtcars'라는 데이터 프레임의 모든 변수에다가 'class()라는 함수를 적용해라(sapply)고 했을 때의 결과로서, 11개의 각 변수별로 속성을 나타내고 있습니다.

(참고로, sapply()는 동일한 함수를 모두 적용하라는 함수입니다. 여기서는 class()라는 함수를 mtcars 내의 모든 변수에 공통으로 적용하라는 뜻입니다)

이 또한 목적에 맞게 골라서 사용하면 되겠습니다.

 

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

 

728x90
반응형
Posted by Rfriend
,

오픈소스 R을 무료로 사용하다 보니 세상이 참 많이 바뀌었구나 실감하게 됩니다. 데이터 처리/분석과 관련된 정말 파워풀한 툴인데 이게 무료라니 믿기지가 않거든요.

 

그러면서 SAS나 SPSS 등의 상용 툴 업체들은 어찌될가 걱정이 되고 궁금하기도 합니다. 국내 직장 내에 SAS나 SPSS 사용자가 주류를 차지하고 있기 때문에, 또 이들이 새로운 언어 R을 배우려고 하기 보다는 기존에 이미 익숙한 SAS나 SPSS를 그대로 사용하려고 하는 관성이 작용할 것이기 때문에, 당분간은 SAS나 SPSS가 시장점유율을 유지할 것으로 보이기는 합니다. 하지만 이게 5년, 10년간 계속될지는 의문입니다. 요즘 빅데이터 바람과 함께 R 바람도 거세거든요. 해외에서는 이미 R 사용자가 굉장히 많은 듯 하고, 국내에서도 주변에 R 사용자들이 보이고 있으니 서서히, 가랑비에 옷 젖듯 국내의 직장 내, 학계 내에서도 변화의 바람이 일지 않을 까 싶습니다. 이미 SAS나 SPSS 가 R과의 인터페이스를 자사 솔루션에 탑재했다는 것이 그 증거라고 볼 수도 있을것 같습니다.

 

MOOC (Mass Open Online Course)라고 해서, 온라인을 통해서 전세계의 사용자가 모여서 무료로 강의를 듣을 수 있는 공개 교육을 아는지요? 강사가 보면 스탠포드, MIT, 존스홉킨스 등 특출납니다. 그런데 이게 무료입니다. (본인 인증 자격증을 따려면 일부 유료 강좌도 존재). 

 

coursera, edx, udacity, Khan Academy, canvas 등이 있으니 한번 검색해서 들어가보시기 바랍니다. 강의 주제가 정말 다양하며, 최신의 학술적성과를 자랑하는 주제가 즐비합니다.

 

[ 화면 출처: www.coursera.org 홈페이지 화면 캡쳐 ]

 

MOOC를 보면서 앞으로는 '굳이 대학교 가야하나?'라는 생각을 하는 날이 오지 않을까 싶기도 합니다. MOOC로 못하는 인적네트워크 쌓기라든지 학교의 졸업장 등의 니즈로 인해 대학교가 아예 없어지지는 않겠지만... 예전과는 위상이 많이 달라질거 같다는 예상은 듭니다.  대학교 이사장들, 총장들, 대학교수들은 MOOC 를 보면서 어떤 생각을 하고 있을지 궁금합니다. 

 

아직은 한글로 된 강좌는 없고 대부분이 영어, 일부 중국어 강좌가 있습니다. 영어라는 언어가 한국인 입장에서는 진입장벽이 될 수도 있겠음니다만, 한글 자막 작업이 꾸준히 진행되고 있어서 이 또한 해결의 기미가 보입니다. 지식의 수명이 점점 짧아지고, 이제는 '평생교육'의 시대인데 MOOC는 이제 오픈소스 프로그램과 함께 세상의 변화를 알리는 선봉장 중의 하나라고 생각합니다.

 

R 툴을 노트북에 무료로 깔아서 한국의 안방에서도 존스 홉킨스 교수의 R 교육을 coursera에서 들을 수 있는 시대, 정말 꿈만 같습니다. R 오픈소스 무료 통계툴(수단), MOOC 무료 온라인 강의(지식)가 세상을 좀더 평등하게 만들어주는데 기여를 하지 않을까 기대를 해봅니다.  툴/수단과 지식을 획득하는데 필요한 비용을 획기적으로 낮추어서 '지식노동자'가 이전보다는 쉽게 나올 수 있는 환경이 갖추어졌기 때문입니다. 

 

 

728x90
반응형
Posted by Rfriend
,

지난 포스팅에서

 

- R 데이터 객체를 외부 파일로 내보내서 저장하기 write.table()

 

- R 분석 결과를 외부 파일로 내보내서 저장하기 cat()

 

을 알아보았습니다.

 

 

 R 분석 결과 외부 파일로 저장하기 : capture.output()

 

이번 포스팅에서는 R 분석 결과 외부 파일로 저장하기 : capture.output()에 대해서 알아보도록 하겠습니다. 분석 결과를 외부로 내보내서 저장하는 cat()과 caputre.output()의 차이점은 cat()이 벡터를 다룬다면 capture.output()은 리스트를 다룬다는 점입니다.

 

아래 함수가

누구를 

어떤 데이터 구조를

무슨 일을 하는가? 

 wriite.table()

 데이터 객체

 데이터 프레임

(data frame)

 텍스트 파일로 외부 저장

 cat()  분석 결과  벡터 (vector)

 텍스트 파일로 외부 저장 

 capture.output()

 분석 결과  리스트 (list)   텍스트 파일로 외부 저장

 

 

capture.output() 함수를 아래 실습을 따라하면서 설명하도록 하겠습니다.

 

 

> ## 10명의 키, 몸무게로 데이터 프레임 만들기

> height <- c(175, 159, 166, 189, 171, 173, 179, 167, 182, 170)
> weight <- c(62, 55, 59, 75, 61, 64, 63, 65, 70, 60)
> d.f_h_w <- data.frame(height, weight)
> 

> ## 키와 몸무게 1차 선형 회귀모형 만들기

> lm_fit_h_w <- lm(weight ~ height, d.f_h_w)
> summary(lm_fit_h_w)
 

Call: lm(formula = weight ~ height, data = d.f_h_w) Residuals: Min 1Q Median 3Q Max -3.8614 -1.4780 -0.1812 1.1986 5.1787 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -38.1534 18.2437 -2.091 0.069874 . height 0.5867 0.1053 5.573 0.000527 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 2.727 on 8 degrees of freedom Multiple R-squared: 0.7952, Adjusted R-squared: 0.7696 F-statistic: 31.06 on 1 and 8 DF, p-value: 0.0005268

 

위에 만든 (1) 데이터 프레임과 (2) 회귀모형 적합 결과 summary(lm_fit_h_w) 를 텍스트 파일로 저장해보도록 하겠습니다.

 

  • "Dataset is as follows: " 문구 쓰고, lm_fit_h_w.txt 파일 생성

> cat( "Dataset is as follows; ",
+      "\n", 
+      "\n", 
+      file = "C:/Users/user/Documents/R/lm_fit_h_w.txt") 

 

 

 

  • lm_fit_h_w.txt 파일에 다가 lm_fit_h_w 데이터 프레임 데이터를 붙여서 저장하기 

> write.table(d.f_h_w, "C:/Users/user/Documents/R/lm_fit_h_w.txt", 
+             sep = ",", 
+             row.names = FALSE, 
+             quote = FALSE, 
+             append = TRUE)
Warning message:
In write.table(d.f_h_w, "C:/Users/user/Documents/R/lm_fit_h_w.txt",  :
  열의 이름들을 파일에 추가합니다 

 

 

 

  • "Summary of linear regression model is " 문구 삽입하기 

 

> cat( "Summary of linear regression model is ",
+      "\n", 
+      "\n", 
+      file = "C:/Users/user/Documents/R/lm_fit_h_w.txt", 
+      append = TRUE)

 

 

 

  • summary(lm_fit_h_w) 결과를 lm_fit_h_w.txt 파일에 붙여서 저장하기
    - cat() 함수를 쓰면 'list' 데이터 구조는 처리할 수 없다는 에러 메시지 발생

> cat( "\n", 
+      "\n", 
+      summary(lm_fit_h_w), 
+      file = "C:/Users/user/Documents/R/lm_fit_h_w.txt", 
+      append = TRUE)
Error in cat(list(...), file, sep, fill, labels, append) : 
  argument 3 (type 'list') cannot be handled by 'cat' 

 

 

               - 이때는 capture.output() 함수를 사용하면 됨

 

> capture.output(summary(lm_fit_h_w), 
+                file = "C:/Users/user/Documents/R/lm_fit_h_w.txt", 
+                append = TRUE) 

 

 

키와 몸무게의 1차 선형회귀모형의 summary() 결과가 텍스트 파일에 append 되어 저장되었음을 확인할 수 있습니다.

 

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

 

728x90
반응형
Posted by Rfriend
,

지난 포스팅에서 외부 파일을 R로 불러오는 함수에 대해서 알아봤다면, 이번 포스팅에서는 거꾸로 R에서 처리한 데이터 객체를 외부 파일(텍스트)로 저장하는 함수와 분석결과를 외부 파일로 저장하는 함수에 대해서 알아보겠습니다. 

 

(엑셀로 내보내는 것은 유용할 거 같아 시도해봤는데요, rJAVA가 안깔린다면서 에러가 나네요 -,-;)

 

 


 

 (1) 데이터 객체를 텍스트 파일로 저장: write.table()


지난 포스팅에서 외부 파일에서 R로 불러왔던 'dataset_1' 데이터 프레임을 이번에는 거꾸로 'cust_profile.txt'라는 이름으로 밖으로 내보내서 저장을 해보도록 하겠습니다. 

 

> ## 데이터 객체를 외부 텍스트 파일로 저장: write.table()

> write.table(dataset_1, "C:/Users/user/Documents/R/cust_profile.txt", 

+             sep = ",", 

+             row.names = FALSE, 

+             quote = FALSE, 

+             append = TRUE, 

+             na = "NA"

+             ) 

 

  • write.table( 데이터셋 이름, 저장할 경로/저장할 파일 이름...) 순서로 쓰되, 경로에 구분자가 '\'가 아니라 R에서는 '/' 이므로 주의 요망
  • sep = "," 또는 " " 또는 ":" 등 데이터 구분자 입력.  tab 구분자는 sep = "\t"
  • row.names = FALSE 행 이름(번호)가 생략됨. key 값이 별도로 있으면 생략하고, 혹시 key 값을 관리하고 싶은면 TRUE로 옵션 설정
  • quote = FALSE 면 변수 이름, 행 이름에 인용부호(" ") 생략. 구분자(sep)를 따로 지정하면 굳이 인용부호 없어도 무방
  • append = TRUE 이면 나중에 추가로 동일 파일 이름으로 write.table()함수가 실행될 경우 기존 파일에 덮어쓰기를 하지 않고 계속 이어 붙이기를 함. 덮어쓰기를 하면 기존 파일이 다 날아가버리고 마지막 덮어쓴 이후의 데이터만 남게되어 대략 난감한 상황 발생할 것이므로 append = FALSE 옵션은 조심. 
  • na = "NA" : 결측값이 있으면 "NA"로 표기. na = "." 이면 결측값을 마침표(.)로 표기.


[R 데이터 객체를 외부 텍스트 파일로 저장하기 전]

 

[R 데이터 객체를 외부 텍스트 파일로 저장하기 후 (cust_profile.txt 파일 신규 생성)]


 


 

 (2) 분석 결과를 외부 파일로 저장: cat()


[ 1~10 숫자형 벡터 x를 외부 텍스트 파일로 저장 ]

> ## 1~10 숫자형 벡터 x 생성

> x <- c(1:10)

> mean_x <- mean(x)

> sd_x <- sd(x)

> z_x <- ((x-mean_x)/sd_x)


> ## cat() 함수

> cat( "Data is as follows:", "\n", 

+      x, "\n", 

+      file = "C:/Users/user/Documents/R/data_x.txt", 

+      append = TRUE)


  • 큰따옴표(" ") 안에 텍스트는 그래도 출력됨
  • "\n"은 새로운 줄로 바꾸라는 뜻 (키보드 엔터 치라는 뜻)
  • 벡터 x 를 입력했더니 아래 처럼 벡터 x가 출력되었음. 벡터 연산도 가능. 
  • file = "" 파일 저장 경로 & 파일 이름 지정
  • append = TRUE 동일 경로 & 파일 이름으로 계속 이어 붙이기 하고 싶을 때 사용



[ x의 평균값을 기존 텍스트 파일에 이어 붙여서 저장 ]

> cat( "Mean of x is", mean_x, "\n", 

+      file = "C:/Users/user/Documents/R/data_x.txt", 

+      append = TRUE) 





[ x의 표준편차를 기존 텍스트 파일에 이어 붙여서 저장 ]

> cat( "Standard Deviation of x is", sd_x, "\n", 

+      "\n", 

+      "\n", 

+      "Z score of x is", z_x, "\n", 

+      file = "C:/Users/user/Documents/R/data_x.txt", 

+      append = TRUE) 





양이 적거나, 한번 하고 말일이면 그냥 console 창 가서 눈으로 분석결과 보고서 직접 타이핑하거나, 아니면 블럭 설정해서 복사 > 붙여넣기 하면 됩니다. 다만, 양이 아주 많거나, 아니면 다수 동일 반복작업이 필요한 경우는 cat() 함수로 프로그래밍을 하는게 노가다를 줄이고 정신 건강에도 좋겠지요?! 알아두면 유용한 함수입니다. 


console에 나타나는 모형 적합 결과를 외부 파일로 저장할 때 사용하는 capture.output()은 다음번 포스팅에 소개하도록 하겠습니다. 

 

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


728x90
반응형
Posted by Rfriend
,

R에서 데이터를 c() 함수로 직접 입력하는 방법은 지난 포스팅에서 알아보았습니다. 

 

이 외에도

 

(1) edit() 함수를 이용해 엑셀 처럼 그리드 창에 직접 입력하는 방법과,

 

(2) 외부에서 txt나 csv, 엑셀 파일 등을 직접 불러오는 방법도 있습니다. 



(1) R 데이터 편집기 edit() 


엑셀 처럼 생긴 데이터 편집기 창을 사용하려면 edit() 함수를 이용하며, 데이터 프레임 구조로 저장됩니다. 

비교적 소규모의 데이터를 입력하기에는 써볼만 하겠지만, 대용량 데이터를 입력해야 하는 거라면 좀 무리겠지요? 


## 데이터 입력창 edit() 

> d.f <- data.frame()  # 데이터 프레임을 먼저 생성해 주고 나서, 

> d.f <- edit(d.f)  # 데이터 편집기 창 불러오기



edit() 함수로 데이터 편집기를 호출하면 아래와 같은 창이 뜹니다. 



'var1', 'var2', ....  부분을 클릭하면 '변수 편집기' 창이 팝업되며, '변수명'과 '유형(numeric, character)'을 편집할 수 있습니다. 




2. 외부 파일 데이터 불러오기  read.table() 


다수의 변수에 대해 다수의 관찰값이 2차원 형태로 구성된 데이터 파일을 불러오는데 read.table() 함수를 사용합니다. 


아래와 같은 데이터셋이 있습니다.

 


dataset_1.txt




> ## 외부 데이터셋 파일 불러오기

> dataset_1 <- read.table("C:/Users/user/Documents/R/dataset_1.txt", 

+                         header = TRUE,  # 변수명

+                         sep = ",",  # 구분자

+                         stringsAsFactor = FALSE, # 문자형 데이터를 요인으로 인식할지 여부

+                         na.strings = ""  # 결측값 표시

+                         ) 


  • '#' 은 R이 인식하지 않으므로 '#' 기호를 활용해 데이터셋에 대한 부가적인 설명을 덧붙여 놓을 수 있음

  • 파일 경로 입력할때는 Windows 탐색기 경로 구분자 '\' 가 아니라 '/' 로 반대 방향임을 주의 

  • 구분자 sep에는 콤마 ",", 빈칸 " ", ":", tap (sep = "\t") 등이 있음

  • stringsAsFactor = TRUE 하면 문자형 데이터를 요인(factor)으로 인식함. 요인으로 불러오는게 맞는지 아닌지 확인 필요

  • na.strings = "", ".", "NA" 등이 있음

  • 'csv' 파일은 read.csv() 함수를 사용. read.table() 함수와 다른 점은, read.csv()함수는 sep="," 옵션이 필요 없다는 점과 파일명 끝이 "dataset_name.cvs"로 끝난다는 점. csv 파일이 'comma separated values'의 약자로서 콤마로 구분자가 되어 있기 때문임. 


RStudio 의 우측 상단 'Environment' 메뉴에 보면 'dataset_1' 데이터 프레임이 생겼음을 확인할 수 있으며, 이를 클릭 시 왼쪽 상단에 'dataset_1' 이름으로 데이터셋 보기 화면이 열린다. 




엑셀, SAS, SPSS, 인터넷 홈페이지에서 불러오는 패키지가 있기는 합니다만 비추천하므로 포스팅은 생략합니다. 

엑셀은 sheet가 나뉘어져 있을 수도 있고 매크로 등의 함수가 걸려있을 수도 있어서 오류 여지가 있기에 엑셀 파일을 R로 불러오기 하는 것은 비추천합니다. SAS나 SPSS 파일을 불러오는 패키지도 버전 오류 여지가 있기에 비추천합니다. 홈페이지 URL도 언제 어떻게 바뀔지, 언제 없어질지 모르므로 비추천합니다. 

(엑셀 파일 불러오기 참고 ☞ http://rfriend.tistory.com/313 )


그냥 맘편하게, 확실하고 정확하게, txt나 csv 파일로 내려서 파일 불러오기 read.table() 함수 사용하시는걸 추천합니다. 

 

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

 

728x90
반응형
Posted by Rfriend
,