데이터분석 전문가(ADP)를 위한 R프로그래밍 기초편5

1. 데이터프레임

 

데이터에서 각각의 변수에 해당하는 열들의 모임

 

data.frame(벡터, 벡터, 벡터, ...) 벡터들로 데이터셋을 생성함

 

혹은 열 변수벡터로 데이터셋을 생성

 

혹은 data.frame(변수1이름=값, 변수2이름=값, 변수3이름=값,.....)

 

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

> b <- c(5,6,7,8)

> c <- c(9,10,11,12)

> d <- data.frame(a,b,c)

> d
  a b  c
1 1 5  9
2 2 6 10
3 3 7 11
4 4 8 12

> new <- data.frame(a=1,b=2,c=3,d='a')
> new
  a b c d
1 1 2 3 a

N=100

> dtfm <- data.frame(dosage=numeric(N), lab=character(N), response=numeric(N))

> dtfm$lab
  [1] "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
 [42] "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
 [83] "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
 
> dtfm
    dosage lab response
1        0            0
2        0            0
3        0            0
4        0            0
5        0            0
6        0            0
7        0            0
8        0            0
9        0            0
10       0            0
11       0            0
12       0            0
13       0            0
14       0            0
15       0            0
16       0            0
17       0            0
18       0            0
19       0            0
20       0            0
21       0            0
22       0            0
23       0            0
24       0            0
25       0            0
26       0            0
27       0            0
28       0            0
29       0            0
30       0            0
31       0            0
32       0            0
33       0            0
34       0            0
35       0            0
36       0            0
37       0            0
38       0            0
39       0            0
40       0            0
41       0            0
42       0            0
43       0            0
44       0            0
45       0            0
46       0            0
47       0            0
48       0            0
49       0            0
50       0            0
51       0            0
52       0            0
53       0            0
54       0            0
55       0            0
56       0            0
57       0            0
58       0            0
59       0            0
60       0            0
61       0            0
62       0            0
63       0            0
64       0            0
65       0            0
66       0            0
67       0            0
68       0            0
69       0            0
70       0            0
71       0            0
72       0            0
73       0            0
74       0            0
75       0            0
76       0            0
77       0            0
78       0            0
79       0            0
80       0            0
81       0            0
82       0            0
83       0            0
84       0            0
85       0            0
86       0            0
87       0            0
88       0            0
89       0            0
90       0            0
91       0            0
92       0            0
93       0            0
94       0            0
95       0            0
96       0            0
97       0            0
98       0            0
99       0            0
100      0            0

 

as.data.frame()은 벡터나 리스트를 데이터프레임으로 변경시킴

 

> e <- list(1,2,3,4,5)

> e
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 4

[[5]]
[1] 5

> df <- as.data.frame(e)

> df
  X1 X2 X3 X4 X5
1  1  2  3  4  5

 

rbind(a,b)는 a,b를 행으로 결합하고 당연하지만 열의 개수와 열의 이름이 동일해야함

 

> a <- c(1,2,3,4)
> b <- c(5,6,7,8)
> c <- c(9,10,11,12)
> d <- c(13,14,15,16)
> df <- data.frame(a,b,c,d)

> df
  a b  c  d
1 1 5  9 13
2 2 6 10 14
3 3 7 11 15
4 4 8 12 16

> new
  a b c d
1 1 2 3 a

> newdata <- rbind(df, new)

> newdata
  a b  c  d
1 1 5  9 13
2 2 6 10 14
3 3 7 11 15
4 4 8 12 16
5 1 2  3  a

cbind(a,b)는 a,b를 열로 결합을하는데 당연하지만 행의 개수가 동일해야함

 

> newdata
  a b  c  d
1 1 5  9 13
2 2 6 10 14
3 3 7 11 15
4 4 8 12 16
5 1 2  3  a

> newdata2 <- cbind(newdata,1:5)

> newdata2
  a b  c  d 1:5
1 1 5  9 13   1
2 2 6 10 14   2
3 3 7 11 15   3
4 4 8 12 16   4
5 1 2  3  a   5

 

merge(df1, df2, by='공통변수 이름',all=, all.x=, all.y=)으로 df1과 df2를 합칠 수 있다

 

all=T를 주면 왼쪽, 오른쪽 by 데이터를 모두 가져오고(outer join)

 

all.x=T를 주면 왼쪽 by 데이터를 모두 가져온다(left outer join)

 

all.y=T를 주면 오른쪽 by 데이터를 모두 가져온다(right outer join)

> newdata
  a b  c  d
1 1 5  9 13
2 2 6 10 14
3 3 7 11 15
4 4 8 12 16
5 1 2  3  a

> data <- data.frame(d=c(13,14,15,16,42), e=c(7,65,3,21,21))
> data
   d  e
1 13  7
2 14 65
3 15  3
4 16 21
5 42 21


newdata2 <- merge(newdata,data,by='d')
> newdata2
   d a b  c  e
1 13 1 5  9  7
2 14 2 6 10 65
3 15 3 7 11  3
4 16 4 8 12 21

> newdata3 <- merge(newdata,data,by='d',all=T)
> newdata3
   d  a  b  c  e
1 13  1  5  9  7
2 14  2  6 10 65
3 15  3  7 11  3
4 16  4  8 12 21
5 42 NA NA NA 21
6  a  1  2  3 NA

> newdata4 <- merge(newdata,data,by='d',all.x=T)
> newdata4
   d a b  c  e
1 13 1 5  9  7
2 14 2 6 10 65
3 15 3 7 11  3
4 16 4 8 12 21
5  a 1 2  3 NA   #####오른쪽 data의 d열에 존재하는 42가 없음

> newdata5 <- merge(newdata,data,by='d',all.y=T)
> newdata5
   d  a  b  c  e
1 13  1  5  9  7
2 14  2  6 10 65
3 15  3  7 11  3
4 16  4  8 12 21
5 42 NA NA NA 21 #####왼쪽 newdata의 d열에 존재하는 a가 없음

기본 인덱싱은 df[행,열]로 당연히 가능하고

 

조건에 맞는 행,열을 추출하는 fancy indexing도 가능함

> newdata
  a b  c  d
1 1 5  9 13
2 2 6 10 14
3 3 7 11 15
4 4 8 12 16
5 1 2  3  a

> newdata[newdata$a==3,]
  a b  c  d
3 3 7 11 15

> newdata[(newdata$a>2) & (newdata$b > 7),newdata$c>9]
  b  c  d
4 8 12 16

> newdata[1,]
  a b c  d
1 1 5 9 13

> newdata[,2]
[1] 5 6 7 8 2

> newdata$a
[1] 1 2 3 4 1

> newdata[c(a,b)]
Error in `[.data.frame`(newdata, c(a, b)) : undefined columns selected

> newdata[c('a','b')]
  a b
1 1 5
2 2 6
3 3 7
4 4 8
5 1 2

> newdata[[1]]
[1] 1 2 3 4 1

> newdata[['a']]
[1] 1 2 3 4 1

 

subset(데이터프레임, select=변수, subset=변수>조건)으로도 일부 데이터를 조회할 수 있다

 

select = - 변수로 -를 붙이면 해당 변수를 제거한다

 

여러개의 변수를 지정하려면 select = c(변수1, 변수2, 변수3,....)

 

> newdata
  a b  c  d
1 1 5  9 13
2 2 6 10 14
3 3 7 11 15
4 4 8 12 16
5 1 2  3  a

> subset(newdata,select=a, subset=a>3)
  a
4 4

> subset(newdata,select=a)
  a
1 1
2 2
3 3
4 4
5 1

> subset(newdata,select=-a)
  b  c  d
1 5  9 13
2 6 10 14
3 7 11 15
4 8 12 16
5 2  3  a

> subset(newdata,select=c(a,b))
  a b
1 1 5
2 2 6
3 3 7
4 4 8
5 1 2

 

colnames(데이터프레임)으로 데이터프레임의 변수 이름을 조회

 

colnames(데이터프레임) <- 새로운 열 이름 으로 변수명을 변경할 수 있다

 

> colnames(newdata)
[1] "a" "b" "c" "d"

> colnames(newdata) <- c('e','b','c','d')

> newdata
  e b  c  d
1 1 5  9 13
2 2 6 10 14
3 3 7 11 15
4 4 8 12 16
5 1 2  3  a

> colnames(newdata)[1] <- 'a'

> newdata
  a b  c  d
1 1 5  9 13
2 2 6 10 14
3 3 7 11 15
4 4 8 12 16
5 1 2  3  a

 

na.omit(df)로 df에서 NA가 있는 행을 제거함

 

> newdata[['e']] <- c(NA,NA,3,4,5)

> newdata
  a b  c  d  e
1 1 5  9 13 NA
2 2 6 10 14 NA
3 3 7 11 15  3
4 4 8 12 16  4
5 1 2  3  a  5

> NA_cleaning <- na.omit(newdata)

> NA_cleaning
  a b  c  d e
3 3 7 11 15 3
4 4 8 12 16 4
5 1 2  3  a 5

 

2. 자료형 변환

 

as.<자료형>(데이터)하면 주어진 데이터를 <자료형>으로 변환시킴

 

as.logical을 하면 0이 아닌 수는 TRUE, 0은 FALSE, 문자열은 NA로 나온다

 

> as.character(3)
[1] "3"

> as.complex(3)
[1] 3+0i

> as.numeric('3')
[1] 3

> as.double('3')
[1] 3

> as.integer(3.0)
[1] 3


> as.logical(1)
[1] TRUE

> as.logical(3)
[1] TRUE

> as.logical(0)
[1] FALSE

> as.logical(-1)
[1] TRUE

> as.logical('a')
[1] NA

 

비슷하게 as.data.frame(), as.list(), as.matrix(), as.vector()은 각각 데이터프레임, 리스트, 행렬, 벡터로 변환시킴

 

> a<- c(1,2,3)

> as.data.frame(a)
  a
1 1
2 2
3 3

> as.list(a)
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

> as.matrix(a)
     [,1]
[1,]    1
[2,]    2
[3,]    3

 

 

근데 아무거나 변경할 수는 없는듯

 

예를 들어 데이터프레임을 as.vector()하면 벡터로 안나옴

 

그냥 b[[1]]같이 인덱싱으로 하나의 행이나 열을 추출

 

> b <- data.frame(x=c(1,2,3),y=c(3,4,5))

> b
  x y
1 1 3
2 2 4
3 3 5

> as.vector(b)
  x y
1 1 3
2 2 4
3 3 5

> b[[1]]
[1] 1 2 3

> c <- data.frame(x=c(1,2,3))
> c
  x
1 1
2 2
3 3

> as.vector(c)
  x
1 1
2 2
3 3

 

벡터 > 리스트 : as.list(vec)

 

행렬 > 벡터: as.vector(mat)

 

행렬 > 리스트 : as.list(mat)

 

> vec <- c(1,2,3)

> vec
[1] 1 2 3

> as.list(vec)
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

> mat <- matrix(c(1,2,3,4,5,6),nrow=2,ncol=3)

> mat
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

> as.vector(mat)
[1] 1 2 3 4 5 6

> as.list(mat)
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 4

[[5]]
[1] 5

[[6]]
[1] 6

 

행렬 > 데이터프레임: as.data.frame(mat)

 

데이터프레임 > 리스트: as.list(df)

 

데이터프레임 > 행렬: as.matrix(df)

 

리스트 > 벡터: unlist(lst)

 

> mat
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

> as.data.frame(mat)
  V1 V2 V3
1  1  3  5
2  2  4  6

> dfm <- as.data.frame(mat)
> dfm
  V1 V2 V3
1  1  3  5
2  2  4  6

> as.list(dfm)
$V1
[1] 1 2

$V2
[1] 3 4

$V3
[1] 5 6

> as.matrix(dfm)
     V1 V2 V3
[1,]  1  3  5
[2,]  2  4  6

> lst <- as.list(dfm)
> lst
$V1
[1] 1 2

$V2
[1] 3 4

$V3
[1] 5 6

> unlist(lst)
V11 V12 V21 V22 V31 V32 
  1   2   3   4   5   6 
  
> mode(unlist(lst))
[1] "numeric"

 

벡터 > 행렬: cbind(vec)<1열>, rbind(vec)<1행>, as.matrix(vec), matrix(vec,n,m)

 

벡터 > 데이터프레임: as.data.frame(vec)<1열>, as.data.frame(rbind(vec))<1행>

 

> vec <- c(1,2,3,4,5,6)

> vec
[1] 1 2 3 4 5 6

> cbind(vec)
     vec
[1,]   1
[2,]   2
[3,]   3
[4,]   4
[5,]   5
[6,]   6

> as.matrix(vec)
     [,1]
[1,]    1
[2,]    2
[3,]    3
[4,]    4
[5,]    5
[6,]    6

> rbind(vec)
    [,1] [,2] [,3] [,4] [,5] [,6]
vec    1    2    3    4    5    6

> matrix(vec,2,3)
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

> as.data.frame(vec)
  vec
1   1
2   2
3   3
4   4
5   5
6   6

> as.data.frame(rbind(vec))
    V1 V2 V3 V4 V5 V6
vec  1  2  3  4  5  6

 

리스트 > 행렬: as.matrix(lst)<1열>, as.matrix(rbind(lst))<1행>, matrix(lst,n,m)

 

리스트 > 데이터프레임: 

 

원소들이 데이터의 열이면 as.data.frame(lst)

 

원소들이 데이터의 행이면 rbind(obs[[1]], obs[[2]])

 

> vec
[1] 1 2 3 4 5 6

> lst <- as.list(vec)

> as.matrix(lst)
     [,1]
[1,] 1   
[2,] 2   
[3,] 3   
[4,] 4   
[5,] 5   
[6,] 6   

> as.matrix(rbind(lst))
    [,1] [,2] [,3] [,4] [,5] [,6]
lst 1    2    3    4    5    6   

> matrix(lst,2,3)
     [,1] [,2] [,3]
[1,] 1    3    5   
[2,] 2    4    6   

> as.data.frame(lst)
  X1 X2 X3 X4 X5 X6
1  1  2  3  4  5  6

> rbind(lst[[1]],lst[[2]],lst[[3]])
     [,1]
[1,]    1
[2,]    2
[3,]    3

 

이상하게 list의 한 index마다 원소가 여러개 있으면 변환이 이상하게 됨

 

> lst <- as.list(dfm)

> lst
$V1
[1] 1 2

$V2
[1] 3 4

$V3
[1] 5 6

> as.matrix(lst)
   [,1]     
V1 numeric,2
V2 numeric,2
V3 numeric,2

> as.matrix(rbind(lst))
    V1        V2        V3       
lst numeric,2 numeric,2 numeric,2

> as.data.frame(lst)
  V1 V2 V3
1  1  3  5
2  2  4  6

> rbind(lst[[1]],lst[[2]])
     [,1] [,2]
[1,]    1    2
[2,]    3    4

 

4. 벡터 기본 연산

 

벡터끼리 +,-,*로 대응하는 원소끼리 덧셈 뺄셈 곱셈이 가능

 

벡터1 ^ 벡터2를 하면 벡터1의 대응하는 벡터2의 원소에 대한 거듭제곱을 구함?

 

길이가 서로 안맞으면 재활용규칙을 따라서 짧은 길이의 벡터를 처음부터 다시 활용하게 된다

 

> vec1 <- c(1,2,3)
> vec2 <- c(3,4,5)

> vec1+vec2
[1] 4 6 8

> vec1-vec2
[1] -2 -2 -2

> vec1*vec2
[1]  3  8 15

> vec1^vec2
[1]   1  16 243

> vec2 <- c(5,2)

> vec1^vec2
[1]   1   4 243
Warning message:
In vec1^vec2 :
  longer object length is not a multiple of shorter object length
  
> vec1+vec2
[1] 6 4 8
Warning message:
In vec1 + vec2 :
  longer object length is not a multiple of shorter object length

 

5. 주요 기본함수들

 

install.packages('ggplot2') : ggplot2 패키지 설치, ggplot2가 아니라 'ggplot2'라고 따옴표 붙여야함

 

library('MASS') : MASS 패키지 설치, 'MASS'말고도 MASS라고 해도 상관없다

 

data(iris): R에 내장된 데이터셋을 불러올때, iris 데이터셋을 불러와 iris라는 변수에 저장

 

summary(iris)하면 iris에 존재하는 변수들의 요약통계량을 보여줌

 

수치형은 최솟값, 1사분위수, 중위수, 평균, 제3사분위수, 최댓값

 

범주형은 빈도수를 구해줌

 

head(iris,n)는 iris 데이터셋의 위에서부터 n개 행까지만 보여준다

 

기본값은 n=6

 

> summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500      
 
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

 

 

q()하면 세션이 종료된다

 

setwd()로 현재 워킹디렉토리를 지정해줄 수 있다

 

write.csv(데이터, '파일이름.csv')는 데이터를 '파일이름.csv'로 현재 디렉토리에 저장

 

save(데이터, file='파일이름.Rdata')는 데이터를 Rdata파일로 저장

 

read.csv('파일이름.csv')로 csv파일을 읽어온다

 

load('파일이름.R')이나 source('파일이름.R')은 R파일을 불러온다/... 왜 인지는 모르겠지만 에러남

 

> a <- c(1,2,3)

> write.csv(a,'a.csv')

> save(a, file='a.Rdata')

> read.csv('a.csv')
  X x
1 1 1
2 2 2
3 3 3

 

 

위와 같이 실제로 저장이 된다

 

sapply(변수, 함수)는 변수의 각각 원소에 함수를 적용시킴

 

>  a <- c(2,3,4)

>  a
[1] 2 3 4

>  sapply(a,log) 
[1] 0.6931472 1.0986123 1.3862944

 

rm(변수)는 해당 변수를 메모리에서 삭제하고

 

rm(list=ls(all=TRUE))나 rm(list=ls())는 모든 변수를 메모리에서 삭제함

 

 

TAGS.

Comments