프로그래밍을 위한 기초
1. Print 명령
x = 12345
cputime = 12.23455
print(x)
## [1] 12345
print(cputime)
## [1] 12.23455
# 소수점 세째자리에서 반올림
print(round(cputime,3))
## [1] 12.235
# 전체 출력 자리수를 지정
options(digits = 7)
print(cputime)
## [1] 12.23455
options(digits=5)
print(cputime)
## [1] 12.235
print(x+100)
## [1] 12445
# 여러 개의 요소를 paste/paste0를 이용해서 출력
print(paste("x =", x))
## [1] "x = 12345"
print(paste0("x = ", x))
## [1] "x = 12345"
print(paste("CPUTIME:", cputime, "seconds"))
## [1] "CPUTIME: 12.23455 seconds"
2. cat 명령어
# cat 명령어에서는 \n (줄바꿈)과 \t (tab)을 사용가능
cat(x,cputime,"\n")
## 12345 12.235
cat(" 1 \t2 \t3 \t4 \n 5 \t6 \t7 \t8" )
## 1 2 3 4
## 5 6 7 8
# paste가 필요없음
cat("CPUTIME =", cputime, "seconds")
## CPUTIME = 12.235 seconds
3. sprintf 명령어
# C언어에서 사용하는 프린트 명령과 동일
a = 'hello'
b = 12345
c = 12345.1287
sprintf("문자형: %s, 정수형: %d, 실수형: %.3f", a,b,c)
## [1] "문자형: hello, 정수형: 12345, 실수형: 12345.129"
v=c("성별","수학성적")
sprintf("%s은 %s에 따라 차이가 있을 것이다.",v[2],v[1])
## [1] "수학성적은 성별에 따라 차이가 있을 것이다."
4. 내장함수: data파악하기
# Excel 자료 입력
library(openxlsx)
df = read.xlsx("regress.xlsx")
# 자료의 처음 10줄 출력
head(df,10)
## 지역 성별 교직경력 대인관계 자아개념 근무평정 SES점수 근무만족도
## 1 대도시 남자 1~10년 34 78 88 88 88
## 2 대도시 남자 1~10년 23 98 78 56 98
## 3 대도시 남자 1~10년 34 78 98 78 88
## 4 대도시 남자 11~20년 23 88 77 78 89
## 5 대도시 남자 11~20년 34 88 89 67 89
## 6 대도시 여자 11~20년 45 87 89 78 78
## 7 대도시 여자 1~10년 34 89 98 77 78
## 8 대도시 여자 1~10년 34 67 67 56 67
## 9 대도시 여자 11~20년 45 56 78 77 78
## 10 대도시 여자 20년이상 34 78 67 65 89
# 자료의 끝부분 10줄 출력
tail(df, 10)
## 지역 성별 교직경력 대인관계 자아개념 근무평정 SES점수 근무만족도
## 21 소도시 남자 1~10년 56 23 98 34 45
## 22 소도시 남자 1~10년 34 34 56 45 45
## 23 소도시 남자 11~20년 23 56 67 56 56
## 24 소도시 남자 11~20년 34 45 78 45 45
## 25 소도시 남자 20년이상 23 34 89 34 56
## 26 소도시 여자 1~10년 34 45 78 45 45
## 27 소도시 여자 11~20년 45 34 67 34 34
## 28 소도시 여자 11~20년 34 23 56 45 45
## 29 소도시 여자 20년이상 45 34 67 56 56
## 30 소도시 여자 20년이상 56 56 78 66 65
# 자료를 Spreadsheet형태로 보기
View(df)
# 자료의 구조(Structure) 파악하기
str(df)
## 'data.frame': 30 obs. of 8 variables:
## $ 지역 : chr "대도시" "대도시" "대도시" "대도시" ...
## $ 성별 : chr "남자" "남자" "남자" "남자" ...
## $ 교직경력 : chr "1~10년" "1~10년" "1~10년" "11~20년" ...
## $ 대인관계 : num 34 23 34 23 34 45 34 34 45 34 ...
## $ 자아개념 : num 78 98 78 88 88 87 89 67 56 78 ...
## $ 근무평정 : num 88 78 98 77 89 89 98 67 78 67 ...
## $ SES점수 : num 88 56 78 78 67 78 77 56 77 65 ...
## $ 근무만족도: num 88 98 88 89 89 78 78 67 78 89 ...
# 자료의 dimenstion (행과 열의 갯수)
dim(df)
## [1] 30 8
# 열(column)의 갯수
ncol(df)
## [1] 8
# 행 (row)의 갯수
nrow(df)
## [1] 30
5-1. 벡터 및 행렬을 위한 함수
# 1부터 10까지의 숫자를 sampling하는데 중복을 허용함.
x = sample(1:10, 100, replace = T)
# 평균, 표준편차, 숫자별 빈도
mean(x)
## [1] 5.63
sd(x)
## [1] 3.014
table(x)
## x
## 1 2 3 4 5 6 7 8 9 10
## 12 10 7 10 9 6 13 12 8 13
# 정상분포곡선상에 있는 표준점수 10000개를 만듬
y = rnorm(100)
y
## [1] 0.624440 0.033519 -0.540765 0.867318 0.272806 0.323319 0.404472
## [8] 1.668183 -1.002269 1.215616 0.153662 -0.115316 0.761707 -0.228803
## [15] -1.221242 1.827505 1.818888 -1.196756 -0.862211 0.051680 1.278628
## [22] -1.684342 -0.841568 -0.628342 1.064041 1.514199 0.495926 0.323602
## [29] 0.129854 0.453213 0.884617 -1.046167 0.495076 -1.166490 0.793638
## [36] -0.313067 -1.848025 -0.365962 -0.211539 -0.161194 1.143066 1.166525
## [43] -0.641366 -0.870612 -0.314720 -1.000879 -0.102655 -0.612618 0.295002
## [50] -0.834306 -1.522151 0.546793 -1.785482 -1.033856 0.307700 -0.539072
## [57] 0.312883 1.414995 1.803746 0.946751 -0.170918 0.034376 1.306935
## [64] 1.792348 -0.062855 -2.259705 0.721886 0.191716 0.846461 -1.984386
## [71] 0.933123 0.772511 -0.104277 0.032287 0.712484 2.113467 0.114954
## [78] -0.573934 0.997249 -0.270084 -0.974998 0.155392 0.377349 -0.060118
## [85] -0.342150 0.410716 -1.474869 -0.509156 0.845390 -0.383833 0.307216
## [92] 0.966520 2.652861 0.599066 -0.177686 -0.408924 0.580852 1.478688
## [99] -0.168233 0.214584
# y vector의 평균 (0에 가까움)
mean(y)
## [1] 0.11934
# y vector의 표준편차 (1에 가까움)
sd(y)
## [1] 0.96759
# 10 factorial을 계산
factorial(10)
## [1] 3628800
x= 1.23
y=3.56
# 무조건 올림
ceiling(x)
## [1] 2
# 무조건 내림
floor(y)
## [1] 3
5-2. 벡터 및 행렬을 위한 함수
# df 변수중에서 numeric 변수만 추출
df = df[,4:8]
# 행렬의 열(column)별 평균 구하기
colMeans(df)
## 대인관계 자아개념 근무평정 SES점수 근무만족도
## 48.533 54.333 76.267 57.133 63.400
# 열(column)별 합 구하기
colSums(df)
## 대인관계 자아개념 근무평정 SES점수 근무만족도
## 1456 1630 2288 1714 1902
# 열(column)별 표준편차 구하기
apply(df, 2, sd)
## 대인관계 자아개념 근무평정 SES점수 근무만족도
## 20.134 22.166 12.086 15.167 18.548
# 열(column)별 사례수 구하기
colSums(!is.na(df))
## 대인관계 자아개념 근무평정 SES점수 근무만족도
## 30 30 30 30 30
# 행렬의 평균/합/표준편차를 행으로 합치기
stat = rbind(colMeans(df), colSums(df), apply(df, 2, sd), colSums(!is.na(df)))
stat
## 대인관계 자아개념 근무평정 SES점수 근무만족도
## [1,] 48.533 54.333 76.267 57.133 63.400
## [2,] 1456.000 1630.000 2288.000 1714.000 1902.000
## [3,] 20.134 22.166 12.086 15.167 18.548
## [4,] 30.000 30.000 30.000 30.000 30.000
# stat를 90도로 치환하기 (transpose)
tstat = t(stat)
# column에 이름붙이기
colnames(tstat) = c("평균", "합", "표준편차","사례수")
tstat
## 평균 합 표준편차 사례수
## 대인관계 48.533 1456 20.134 30
## 자아개념 54.333 1630 22.166 30
## 근무평정 76.267 2288 12.086 30
## SES점수 57.133 1714 15.167 30
## 근무만족도 63.400 1902 18.548 30
# 행렬의 행(row)별 평균 구하기
rowMeans(df)
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
## 75.2 70.6 75.2 71.0 73.4 75.4 75.2 58.2 66.8 66.6 70.6 59.6 51.6 55.6 62.6 62.4
## 17 18 19 20 21 22 23 24 25 26 27 28 29 30
## 58.2 62.6 62.6 53.8 51.2 42.8 51.6 49.4 47.2 49.4 42.8 40.6 51.6 64.2
# 행(row)별 합 구하기
rowSums(df)
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 376 353 376 355 367 377 376 291 334 333 353 298 258 278 313 312 291 313 313 269
## 21 22 23 24 25 26 27 28 29 30
## 256 214 258 247 236 247 214 203 258 321
# 행(row)별 표준편차 구하기
apply(df, 1, sd)
## 1 2 3 4 5 6 7 8 9 10
## 23.4350 31.7616 24.4786 27.3953 23.9437 17.7285 24.5906 14.3422 15.3851 20.5985
## 11 12 13 14 15 16 17 18 19 20
## 12.5220 14.3457 16.6823 22.2666 16.6823 8.9051 18.0748 19.9825 14.7580 14.3422
## 21 22 23 24 25 26 27 28 29 30
## 28.9085 9.2033 16.6823 16.6823 26.2621 16.6823 14.3422 12.5419 12.5419 9.0664
# 행(row)별 사례수 구하기
rowSums(!is.na(df))
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
## 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
## 27 28 29 30
## 5 5 5 5
# solve (역행렬 구하기, %*%: 행렬의 곱)
x = matrix(sample(1:20, 12), 4,3)
# moment matrix
xx = t(x) %*% x
solve(xx)
## [,1] [,2] [,3]
## [1,] 0.0165189 -0.023928 0.0087477
## [2,] -0.0239285 0.039758 -0.0174293
## [3,] 0.0087477 -0.017429 0.0115368
# 단위행렬
solve(xx) %*% xx
## [,1] [,2] [,3]
## [1,] 1.0000e+00 0 4.4409e-16
## [2,] 8.8818e-16 1 -8.8818e-16
## [3,] -8.8818e-16 0 1.0000e+00
6-1. for loop
# 1부터 10까지 출력하는 loop (세가지 방식)
for (i in 1:10) {
print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
# 한 줄로 만듦
for (i in 1:10) {print(i)}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
# 한 줄로 만들고 {}을 사용하지 않음
for (i in 1:10) print(i)
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
# 1부터 100까지 합을 구하는 loop
# 한 줄로 표현
hap = 0
for (i in 1:100) hap = hap + i
print(hap)
## [1] 5050
# {}를 사용한 loop
hap = 0
for (i in 1:100) {
hap = hap + i
}
print(hap)
## [1] 5050
# 1부터 10까지 곱 (factorial)을 구하는 loop
gop = 1
for (i in 1:10) {
gop = gop * i
}
print(gop)
## [1] 3628800
# 1단부터 3단까지 구구단을 만드는 loop
for (j in 1:3) {
for (i in 1:9) {
cat(j,"*", i, "=", 1*i,"\n")
}
}
## 1 * 1 = 1
## 1 * 2 = 2
## 1 * 3 = 3
## 1 * 4 = 4
## 1 * 5 = 5
## 1 * 6 = 6
## 1 * 7 = 7
## 1 * 8 = 8
## 1 * 9 = 9
## 2 * 1 = 1
## 2 * 2 = 2
## 2 * 3 = 3
## 2 * 4 = 4
## 2 * 5 = 5
## 2 * 6 = 6
## 2 * 7 = 7
## 2 * 8 = 8
## 2 * 9 = 9
## 3 * 1 = 1
## 3 * 2 = 2
## 3 * 3 = 3
## 3 * 4 = 4
## 3 * 5 = 5
## 3 * 6 = 6
## 3 * 7 = 7
## 3 * 8 = 8
## 3 * 9 = 9
6-2. while loop
# i가 5보다 큰 경우에 i를 출력
i = 10
while (i > 5) {
print(i)
i = i - 1
}
## [1] 10
## [1] 9
## [1] 8
## [1] 7
## [1] 6
# i가 5보다 크면서 j가 15보다 작은 경우에는 i와 j를 출력
i = 10
j = 10
while(i > 5 & j < 15) {
print(paste("i =", i, "j =", j))
i = i - 1
j = j + 1
}
## [1] "i = 10 j = 10"
## [1] "i = 9 j = 11"
## [1] "i = 8 j = 12"
## [1] "i = 7 j = 13"
## [1] "i = 6 j = 14"
6-3. if statement
# if문: 어떤 숫자가 짝수인지 확인하여 출력하는 것
n = 10
if (n %% 2 == 0) {
print(paste(n, "is even number."))
}
## [1] "10 is even number."
# if문: 어떤 숫자가 짝수인지 홀수인지 확인하여 출력하는 것
n = 9
if (n %% 2 == 0) {
print(paste(n, "is even number."))
} else {
print(paste(n, "is odd number."))
}
## [1] "9 is odd number."
7. function 만들기
# 두개의 숫자를 입력받아서 합계를 구하는 function (1)
add = function(a, b) {
return (a+b)
}
add(10,100)
## [1] 110
# 두개의 숫자를 입력받아서 합계를 구하는 function (2)
add = function(a, b) {
c = a+b
return(c)
}
# 두개의 숫자를 입력받아서 곱셈을 한 결과를 구하는 function
gop = function (a, b) {
c = a*b
return(c)
}
gop(10,100)
## [1] 1000
# 1부터 n까지 숫자를 더한 결과를 구하는 function
hap = function(n) {
hap = 0
for (i in 1:n) hap = hap + i
return(hap)
}
hap(100)
## [1] 5050
hap(1000)
## [1] 500500
# 1부터 n까지 숫자를 곱한 결과를 구하는 function
ggop = function(n) {
gop = 1
for (i in 1:n) gop = gop * i
return(gop)
}
ggop(10)
## [1] 3628800