2020 전산통계학 3차 과제 - if, for, function

코딩 공부/R-전산 통계학 2020. 10. 20. 12:40
반응형

1번) 1에서 100까지 숫자 중 3의 배수는 “T“, 5 배수는  “F“, 15의 배수는 “TF"  print 하기

ys <- c(1:100)
for (i in 1:length(ys)) {
  if ((i%%3)==0) {ys[i] <- "T"}
  if ((i%%5)==0) {ys[i] <- "F"}
  if ((i%%15)==0) {ys[i] <- "TF"}
}
ys


2번) 50의 인수를 찾는 function 짜기

find <- c()
ys <- function (n) {
  for (i in 1:50) {
  if (n%%i==0) {print (i)}  
    }
}
ys(50)


3번) 벡터  x = c(10, 20, 30, 20, 20, 25, 9, 26, 19, 20)에서 20의 개수를 세는  프로그램 짜기

x = c(10, 20, 30, 20, 20, 25, 9, 26, 19, 20)

yscount <- function (vect) {
  count=0
  for (i in 1:length(vect)) {
    if (vect[i]==20) {count=count+1}
  }
  count
}
yscount(x)


4번) 벡터  x = c(10, 20, 30, 20, 20, 25, 9, 26, 19, 20)에서 두번째 큰 수 찾기

x = c(10, 20, 30, 20, 20, 25, 9, 26, 19, 20)

ys2max <- function (vect) {
  sortvect <- sort(vect)
  sortvect[length(vect)-1]
}
ys2max(x)


5번) v1 = c(1,3,5,7,9,11)   v2 = c(2,4,6,8,10,12)를 행과 열로 합치는 프로그램 짜기

v1 = c(1,3,5,7,9,11)
v2 = c(2,4,6,8,10,12)

bindcube <- function (vect1, vect2) {
  cube1 <- matrix(c(vect1,vect2), nr=2, byrow = T)
  cube2 <- matrix(c(vect1,vect2), nc=2, byrow = F)
  cube <- list(cube1, cube2)
  names(cube) <- c("Row Bind", "Cloumn Bind")
  cube
}
bindcube(v1,v2)


6번) v = c(1, 2, NULL, 3, 4, 5)에서 숫자는 3을 더하고 NULL은 제외하는 새로운 벡터 new_v 를 만드는 프로그램 짜기

v = c(1, 2, NULL, 3, 4, 5)

ys <- function (vect) {
  new_v <- as.numeric(vect)
  new_v <- (new_v)+3
  new_v
}
ys(v)


7번)M = matrix(c(1:16),nrow=4)에서7이상 숫자로 구성되는submatrix을 만드는 프로그램 짜기
(문제에서 요구하는 submatrix 라는 표현이 대수학의 것인지, 아니면 그냥 수정하고 남은 것을 말하는지 혼동되어 따로 풀이 X)


8번) m = matrix(c(1:16), nrow = 4, byrow = TRUE)에서 가장 큰 수와 가장 작은 수의  index 구하기 (hint:  which사용)

m = matrix(c(1:16), nrow = 4, byrow = TRUE)

maxmin <- function (data) {
  a <- which.max(data)

  b <- which.min(data)

 c(a,b)
}
maxmin(m)


9번) X =  matrix(1:16, 4)을 시계방향으로 90도 회전시켜서 print 하기

X =  matrix(1:16, 4)

turn <- function (data) {
  n <- sqrt(length(data))
  turnmatrix <- matrix(NA ,nr=n, nc=n)
  
  for (i in 1:n) {
    for (j in n:1) {
      turnmatrix[i,j] <- n*(i-1)+(n+1-j)
    }
  }
  turnmatrix
}
turn(X)


10번) exam_data =data.frame(score = c(12.5, 9, 16.5, 12, 9, 20, 14.5, 13.5, 8, 19), attempts = c(1, NA, 2, NA, 2, NA, 1, NA, 2, 1)
, qualify = c('yes', 'no', 'yes', 'no', 'no', 'yes', 'yes', 'no', 'no', 'yes’)) 안에 있는  NA를 5로 치환하기

exam_data = data.frame(score = c(12.5, 9, 16.5, 12, 9, 20, 14.5, 13.5, 8, 19)
                       ,attempts = c(1, NA, 2, NA, 2, NA, 1, NA, 2, 1) 
                       ,qualify = c('yes', 'no', 'yes', 'no', 'no', 'yes', 'yes', 'no', 'no','yes'))

for (i in 1: nrow(exam_data)) {if (is.na(exam_data[,2])[i]==TRUE) {
  exam_data[,2][i]=5
}
}

exam_data


11번) if, elseif  for 명령어만 사용하여 문제에서 원하는 형태의 행렬로 바꾸거나 구하기

# 대각 행렬=0 (그런데 대각행렬은 원래 주대각선 제외 원소=0 인데...)

data <- matrix(1:25,5)
n <- sqrt(length(data))

for (i in 1:n) {
  for (j in 1:n) {
    if (i==j) {data[i,j] <- data[i,j]}
    else if (i>j) {data[i,j] <- 0}
    else if (i<j) {data[i,j] <- 0}
  }
}

data


# 전치행렬
data <- matrix(1:25,5)
n <- sqrt(length(data))

for (i in 1:n) {
  for (j in 1:n) {
    if (i>j) {y <- data[i,j]
    z <- data[j,i]
    data[i,j] <- z
    data[j,i] <- y}
  }
}

data
t(matrix(1:25,5))

all.equal(data, t(matrix(1:25,5)))


# 3의 배수는 0, 5의배수는 1, 15의 배수는 2로 변경
data <- matrix(1:25,5)
n <- sqrt(length(data))

for (i in 1:n) {
  for (j in 1:n) {
   if ((n*(j-1)+i)%%3==0) {data[i,j] <- 0}
   else if ((n*(j-1)+i)%%5==0) {data[i,j] <- 1}
   else if ((n*(j-1)+i)%%15==0) {data[i,j] <- 2}
  }
}

data


# 1행과 5행 변경
data <- matrix(1:25,5)
n <- sqrt(length(data))

for (i in 1:n) {
  for (j in 1:n) {
    y <- data[1,j]
    data[1,j] <- data[5,j]
    data[5,j] <- y
  }
}

data


# 1열과 5열 변경
data <- matrix(1:25,5)
n <- sqrt(length(data))

for (i in 1:n) {
  for (j in 1:n) {
    y <- data[i,1]
    data[i,1] <- data[i,5]
    data[i,5] <- y
  }
}

data


# Z=0
data <- matrix(1:25,5)
n <- sqrt(length(data))

for (i in 1:n) {
  for (j in 1:n) {
    if (i==1|i==5) {data[i,j] <- 0}
    else if (i+j==n+1) {data[i,j] <- 0}
  }
}

data


# ㅁ=0
data <- matrix(1:25,5)
n <- sqrt(length(data))

for (i in 1:n) {
  for (j in 1:n) {
    if (i==1|i==5) {data[i,j] <- 0}
    else if (i+j==n+1) {data[i,j] <- 0}
  }
}

data


# X=0

data <- matrix(1:25,5)
n <- sqrt(length(data))

for (i in 1:n) {
  for (j in 1:n) {
    if (i==j|i+j==n+1) {data[i,j] <- 0}
  }
}

data


<과제 총평>

1번 : if 말고도 else if 나 ifelse 를 사용하여 더 간단하게 만들 수도 있겠지만, 여러 조건마다의 변경이 필요하다면 하나하나의 if+else if 를 사용하는 것이 좋습니다

 

2번 : 문제 해설에도 적혀 있듯이, print로 나온 결과 값을 어떻게 해야 vector 나 logical 형태로 가져올 수 있을지 고민해봅시다

 

3번 : 사실 which 하나만 사용하면 아주 쉬움

 

4번 : 참고로 sort를 사용하지 않고도 조건문을 활용하여 값을 도출해낼 수도 있습니다

 

5번 : rbind, cbind 이하생략

 

6번 : 프로그램 내에서 새로 벡터를 만들어서 더하기만 하면 되니 안 어려움

 

7번 : 필자도 진중히 생각해봤는데 어떤 submatrix 를 원하는 건지 모르겠음...

 

8번 : 이것도 3번처럼 which 잘 활용할줄 안다면 너무 쉽습니다

 

9번 : turn 함수를 이용하면 매우 쉽습니다, 그런데 교수님 특성상 "그거를 직접 프로그래밍 할 수 있어야지!" 라고 하실 확률이 있어서 부득이하게 원소값의 규칙과 배열로만 일반화해서 풀었습니다

 

10번 : which 의 장점은 내가 구하는 값이 "몇 번째의" 데이터인지를 쉽게 찾아준다는 점이 있습니다, 그 점을 잘 활용해봅시다

 

11번 : 시험에 꼭 한 문제는 나오는 단골 친구입니다, (2018년 중간고사 출제문제 : "부모" 글자 모양=0 으로 만들기

TAG