전산통계학 2주차 강의 - apply, else if, if, ifelse, Order, rank, Sort, Which

코딩 공부/R-전산 통계학 2019. 11. 14. 12:31
반응형

기본적인 연산 명령어

x <- c(4, 7, 2, 10, 1, 0) 
x[x>4]                           x의 원소중에 4보다 큰 원소를 모두 나열하라

which(x>=4)                   x의 원소중에 4이상인 원소가 몇번째 원소들인가해서 1,2,4번째 원소가 해당됨
x[which(x>=4)]
x[c(1,2,4)]

그렇다면 짝수만 나오게 하는 것도 가능할까?
x[x%%2==0]                     2로 나누었을때의 나머지=0 임을 말하는 것이다

 

which.max(x) 
x[which.max(x)] 
max(x) 
min(x)
rank(x)                       x원소중에서 작은순으로 표기
order(x)                     작은순으로 자리표기
sort(x)                       작은순에서 큰순으로 나열
sort(x,decreasing=T)     큰순에서 작은순으로 나열

sum(x)
prod(x)                     원소들을 모두 곱한것
cumsum(x)                 앞에서부터 순차적으로 원소를 더해나감
cumprod(x)                앞에서부터 순차적으로 원소를 곱해감
var(x)                        variance
sd(x)                         sqrt(var.)
fivenum(x)                 제일작은값, 25%값, 50%값, 75%값, 제일 큰 값 5개를 나열

length(x)                    x의 원소의 개수
rev(x)                         reverse = 반대로 나열


Matrix 연산
A <- matrix(1:4, nrow=2) 
B <- matrix(1, nrow=2, ncol=2) 
A
B
A*B            같은 자리의 원소끼리만 곱
A%*%B       우리가 아는 행렬의 곱 방식


<문제>

그렇다면, A*B 는 도대체 어떤 식의 연산을 의미하는 것일까?


y<-1:3 
y%*%y       내적(inner product)=(1*1)+(2*2)+(3*3) 해서 'scalar'가 됨 
y*y            같은자리의 원소끼리만 곱해서 'vector'가 됨 

diag(5)       n*n id 행렬 소환


apply
x <- matrix(1:12, nrow=3, ncol=4)
x
apply(x, 1, sum)               x의 '1=row, 2=column'에 대해서 뒤의 명령어를 실행하라
apply(x, 2, mean)


Data Type (numeric, logical, character)
1.Numeric : "숫자" 따옴표안에 있는것은 문자로 인식함

x<-"1"

x

여기서 나오는 x의 1은 우리가 아는 수학적 자연수인 1이 아니라, 그냥 문자 그 자체의 "1"인 것이다. 


2.Logical 
x <- 1:10
x|y                                           x or y
(x%%2==0) | (x > 5)                    왼쪽경우이거나 오른쪽경우인 것 (즉, 둘중 하나만 성립하면 T)  
(x%%2==0) | (x%%3==0)
x[(x%%2==0) | (x%%3==0)]           왼쪽의 조건을 만족하는 원소들을 보여준다

x=1:100
(x%%5==0) & (x%%15!=0)            5의배수는 넣지만 15의배수는 빼라
x[(x%%5==0) & (x%%15!=0)]

(x%%6==0) & (x%%8==0)
x[(x%%6==0) & (x%%8==0)]
mean(x[(x%%6==0) & (x%%8==0)])

y <- 5:15 
x %in% y                                       x에 y가 어떤게 들어있는지 체크해줌


3.character
animals <- c("bird", "horse", "fish")      만약 bird대신 1이 있었어도 문자로 인식함
toupper(animals)


if (for 과 더불어서 가장 많이 쓰게될 놈)

x=1:10
for(i in 1:length(x)){
  if(x[i]>8) {x[i]<-0}
}
x
만약 x의 i번째 원소가 8보다 크다면, 그 원소에 0을 대신 대입해라


'왼쪽위에서 오른쪽아래로 향하는 대각선 원소=0' 으로 만들어보자
x=matrix(1:100,10)
for( i in 1:ncol(x)){
  for(j in 1:ncol(x)){
    if(i==j) x[i,j]=0
  }
}
x


'오른쪽위에서 왼쪽아래로 향하는 대각선 원소=0' 으로 만들어보자
x=matrix(1:100,10)
for (i in ncol(x):1){
  for(j in 1:ncol(x)){
    if (i+j==11) x[i,j]=0
  }
}  
x


<문제>

그렇다면, '오른쪽위에서 왼쪽아래로 향하는 대각선 원소중에서 가운데 4개만 =0' 으로 만들 수 있겠는가?

x=matrix(1:100,10)
for (i in 7:4){
  for(j in 1:ncol(x)){
    if (i+j==11) x[i,j]=0
  }
}  
x


ifelse, else if (if 의 자매품이면서, 꽤 많이 쓰는 놈)

x 매트릭스의 원소 중에서 '3의배수=0, 6의배수=1, 9의배수=2' 로 만들어라
x=matrix(1:100,10)
x
for(i in 1:ncol(x)){
  for(j in 1:ncol(x)) {
    if(x[i,j]%%9==0) x[i,j]<-2
    else if(x[i,j]%%6==0){x[i,j]<-1}
    else if(x[i,j]%%3==0){x[i,j]<-0}
  }
}
x

else if 는 ifelse 랑 다르게 위에 9로 안나눠진다고 가정했을때 6으로 나눠지면 1을 대입하라는 의미


<첨언>

ifelse(x[i,j]%%10==0,x[i,j]<-2,x[i,j]<-0) 
만약, 앞에 %%10=0이 성립하면 x[i,j]=2이고, 그 것이 아니면 그 뒤의 값을 가지게 해라


else if (앞에게 안되고 중간 else if 조건문이 되면 그에 대한 값을 대입하라)


그렇다면 'x의 Z자 원소=0 , 오른쪽위=1, 왼쪽아래=2' 를 만들 수 있겠는가? (굳이 else if, ifelse 를 사용할 필요는 없다) 

x=matrix(1:100,10)
x
for(i in 1:ncol(x)){
  for(j in 1:ncol(x)){
    if(i==1){x[i,j]<-0}
    if(i==ncol(x)){x[i,j]<-0}
    if(i+j==ncol(x)+1){
      x[i,j]<-0
      if(i==1){x[i,10]<-1}
      if(i==10){x[i,1]<-2}
      
    }
  }}
x

TAG