R강의: 제2강

프로그래밍을 위한 기초

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