데이터분석 전문가(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())는 모든 변수를 메모리에서 삭제함
'프로그래밍 > R 프로그래밍' 카테고리의 다른 글
데이터분석 전문가(ADP)를 위한 R프로그래밍 기초편7 (0) | 2022.02.12 |
---|---|
데이터분석 전문가(ADP)를 위한 R 프로그래밍 기초편6 (0) | 2022.02.10 |
데이터분석 전문가(ADP)를 위한 R프로그래밍 기초편4 (0) | 2022.02.06 |
데이터분석 전문가(ADP)를 위한 R프로그래밍 기초편3 (0) | 2022.02.05 |
데이터분석 전문가(ADP)를 위한 R프로그래밍 기초편2 (0) | 2022.01.31 |