2020 전산통계학 3차 과제 - if, for, function
코딩 공부/R-전산 통계학 2020. 10. 20. 12:401번) 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 으로 만들기