전산통계학 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