전산통계학 6주차 강의 - apply, Array, Break, Next, repeat, while

코딩 공부/R-전산 통계학 2019. 11. 17. 03:00
반응형

break : 조건이 맞다면 거기서 끝내라
x<-1:5
x
for (val in x) {
  if (val ==3) {break
  }
  print(val)
}


next : 어떤 조건에 맞는값이 나온다면 다음으로 건너뛰어라
x <- 1:5
for (val in x) {
  if (val == 3){
    next
  }
  print(val)
}


while : for과 다르게 시작할때 정의와 끝값이 필요함
i=1
while (i<11) {
  result<-i*2
  print(result)
  i=i+1
  if (result ==22) {break}
}

 


repeat : 특정 상황을 반복하다가 조건이 반복되면 종료
i<-1
repeat{
  result=i*2
  if(result>20) {break}
  print(result)
  i=i+1
}


<문제>

15의배수가 3번 나오면 break

i<-1
repeat{
  if(i/15 >3) {break}
  print(i)
  i=i+1
}


<문제>

순서대로 더해나가는 것이 100,200 사이에있다면 그것만 뽑아라 ; repeat, while 둘다 써보기

i<-1
repeat {
  result <- i*(i+1)/2
  if (result>200) {break}
  if (result>100)
    print(result)
  i=i+1
}


i<-1; result<-0
while(result<200) {
  if (result>100) print(result)
  i=i+1
  result<-i*(i+1)/2
}


apply

x <- matrix(1:12, nrow=3, ncol=4)
x


"1=row ; 2=column 을 뜻한다, (나중에 3도 나오는데, 3은 차원을 말합니당)"


apply(x, 1, sum) 
apply(x, 2, min)


<문제>

apply 함수처럼 1,2에 따라서 로우 칼럼 다르게 또한 썸과 민도 2개에따라서 나오게끔 똑같이 for ,if써서 똑같이 나오게 해봅시다


x <- matrix(1:12, nrow=3, ncol=4)
x
apply(x,1,mean)

y=c()

sm<-function(x,num,q) {
  y=c()
  if (num==1) {
    for (i in 1: nrow(x)) {
    if (q=="sum") { y<-c(y, sum(x[i,]) )}
    if (q=="mean") { y<-mean(x[i,]) }
    }
  }
  if (num==2) {
    for (j in 1: ncol(x)) {
      if (q=="sum") { y<-c(y, sum(x[,j]) )}
    if (q=="mean") { y<-mean(x[,j]) }
    }
  }
  y
}
sm(x,1,"sum")
sm(x,1,"mean")


array 

w <- array(1:12, dim=c(2,3,2),dimnames=list(c("A","B"), c("X","Y","Z"), c("N","M")))
w

위의 apply 가 2차원을 다룬다면 (행과 열),  array 는 3차원을 다룬다고 생각해보자 (행과 열, 차원)


w[2,3,1]
w[1:2,,"M"]
w[,,"M"]

apply(w, 1, sum) ; "A","B" 에 대해서 해보라구
apply(w, 2, sum) ; "X","Y","Z" 에 대해서 해보라구
apply(w, 3, sum) ;  "M","N" 에 대해서 해보라구 

<문제>

그러면 array 에서의 apply 를 우리가 임의로 프로그램을 짜서 동일하게 만들 수 있지 않을까?

(2차원에서 할 때랑 동일하게 하면 안되는 것이, array는 3차원 이기 때문에, 어떤식으로 데이터를 뽑을지 + 차례대로 어떻게 연산시킬지를 모두 고려해봐야 할 겁니다)

 

TAG