배열
d<- data.frame()
배열/데이터프레임/테이블 만들기
drop=FALSE 테이블형태를 유지하게 할때
테이블형태 그대로 테이블 추출
> (d<-data.frame(a=1:3, b=4:6, c=7:9))
a b c
1 1 4 7
2 2 5 8
3 3 6 9
> d[,names(d) %in% c("b","c")]
b c
1 4 7
2 5 8
3 6 9
> d[, !names(d) %in% c("b")]
a c
1 1 7
2 2 8
3 3 9
데이터 많을 때, 일부 위쪽 %개 추출
> head(데이타프레임 이름,원하는 개수)
> tail : 뒤쪽
> View(데이타프레임 이름) : 위쪽 창에 테이블/표 형태로
class(x) : x의 클래스
str(x) : x의 구조
is.factor(x) : x가 팩터냐?
is.numeric(x) : x가 숫자냐?
is.character(x) : x가 문자열이냐?
is.matrix(x) : x가 행렬이냐
is.array(x)
is.data.frame(x)
drop=FALSE 데이터 변환하지 않는다.
> stringAsFactor=FALSE : 문자열을 팩터로 인식하게 함
as.factor(x) : x를 팩터로 변환
as.numerix(x) ....... character, matrix, array, data.frame 등등
제어/조건/반복문
제어문 : if, ifelse
반복문 : for, while, repeat
연산 : 사칙연산, 논리연산
함수 : 반복적인(자주 사용되는) 기능을 수행하는 명령어들의 묶음
> x <- c(1:8)
[1] 1 2 3 4 5 6 7 8
> ifelse(x%%2==0,"짝수","홀수")
[1] "홀수" "짝수" "홀수" "짝수" "홀수" "짝수" "홀수" "짝수"
>
for(i in 10:20){
print(i)
} : 자동으로 i 1씩 증가, 10~20까지 i 프린트
while(조건<=20){
print(i)
i<- i+1
} : 조건에 만족할 때까지, i프린트, i에 i+1 대입
repeat{
반복~~
if(조건){
break
}
i<- i+1
}
수치연산
- 사칙연산, 나머지, 몫, 지수, 로그, 삼각함수 등
나머지
> 5%%3
[1] 2
몫
> 5%/%3
[1] 1
제곱근
> 2^3
[1] 8
지수
> exp(3)
[1] 20.08554
로그
> log2(8)
[1] 3
> log10(100)
[1] 2
> sin(1/2)
[1] 0.4794255
> cos(1/2)
[1] 0.8775826
> tan(1/2)
[1] 0.5463025
연산 순서
> 1:3 * 5+10
[1] 15 20 25
->먼저 1부터3에 5를 곱해서 5, 10, 15, +10, 15 20 25
> x<-c(1,2,3)
> x*5
[1] 5 10 15
->x 전체에 5가 곱해진다
> a<-c(2,4,6,8,10)
> a+a
[1] 4 8 12 16 20
> a==a
[1] TRUE TRUE TRUE TRUE TRUE
각각에 대한 데이터 단위로 비교
> a==c(1,2,3,4,10)
[1] FALSE FALSE FALSE FALSE TRUE
> c(T,T)&c(T,F)
[1] TRUE FALSE
->True와 True = True, True와 False = False
> x<-c(1,8,9,10,11)
> sum(x)
[1] 39
> mean(x)
[1] 7.8
> median(x)
[1] 9
-> 중앙값이 홀수일 때는 가운데 수, 짝수일 때는 중앙 2개 평균
> x<-c(1,2,8,9,10,11,100000)
> mean(x)
[1] 14291.57
> median(x)
[1] 9
-> mean과 median의 차이가 큰, 유의
> (x <- c(1,2,3,4,5))
[1] 1 2 3 4 5
> ifelse(x%%2==0,"even","odd")
[1] "odd" "even" "odd" "even" "odd"
> a<-data.frame(x=c(1,2,3), y=c("a","b","c"))
> a
x y
1 1 a
2 2 b
3 3 c
> a[c(TRUE,TRUE,FALSE),]
x y
1 1 a
2 2 b
->True, True, False인 마지막 줄 탈락 참조
> a[a$x%%2==0,]
x y
2 2 b
->a의 x열 값을 2로 나누었을 때 나머지 값이 0인 경우만 참조
NA처리
NA(Not Available)
: 값이 기록되어 있지 않은 경우, 관측되지 않은 경우 // 결측치
ex) 시험
a : 80, b : 0, c : 50, d : 결시(NA)
> 1+1
[1] 2
> 1+NA
[1] NA
> TRUE & NA
[1] NA
-> 데이터 속에 NA가 포함되면, 결과는 무조건 NA다.
> sum(c(1,2,NA))
[1] NA
> sum(c(1,2,NA), na.rm = TRUE)
[1] 3
-> na.rm = TRUE = na를 제거하겠다 remove
> a<- data.frame(x=c(1,2,3), y=c("i","j",NA), z=c("h","i",NA))
> a
x y z
1 1 i h
2 2 j i
3 3 <NA> <NA>
> na.fail(a)
Error in na.fail.default(a) : 객체안에 결측값들이 있습니다
> na.omit(a)
x y z
1 1 i h
2 2 j i
> na.exclude(a)
x y z
1 1 i h
2 2 j i
-> NA가 있는 행은 삭제하라 함수, omit, exclude
-> omit과 exclude의 차이점 :
> df<- data.frame(x=1:10, y=seq(1,19,2))
> df
x y
1 1 1
2 2 3
3 3 5
4 4 7
5 5 9
6 6 11
7 7 13
8 8 15
9 9 17
10 10 19
> df[5,2] <- NA
> df
x y
1 1 1
2 2 3
3 3 5
4 4 7
5 5 NA
6 6 11
7 7 13
8 8 15
9 9 17
10 10 19
-> linear 모델을 만들 때(값을 예측할 때 쓰임)
> resid(lm(y~x,data=df,na.action = na.omit))
1 2 3 4 6
2.737814e-15 -2.647896e-15 -1.707033e-16 -1.025825e-16 -1.883857e-16
7 8 9 10
-3.423096e-16 -5.214426e-17 2.380211e-16 5.281864e-16
> resid(lm(y~x,data=df,na.action = na.exclude))
1 2 3 4 5
2.737814e-15 -2.647896e-15 -1.707033e-16 -1.025825e-16 NA
6 7 8 9 10
-1.883857e-16 -3.423096e-16 -5.214426e-17 2.380211e-16 5.281864e-16
->5의 여부 // 자세한 것은 나~중에
> na.pass(a)
x y z
1 1 i h
2 2 j i
3 3 <NA> <NA>
함수(function)
자주 반복되어 사용되는 특정 기능을 정의
출력기능(50줄 코드) -> 간편하게
종류 :
R시스템에서 제공하는 함수
사용자 정의 함수
함수 정의
함수 이름 <- function(인수,인수){ // 인수 없을 수도, 하나일 수도 ~
함수 코드
return(반환값) // return이 없을 수도
}
예제)
> hap <- function(n){
+ res <- 0
+ for(i in 1:n){
+ res<- res+i
+ }
+ return(res)
+ }
> hap(5)
[1] 15
> myfact<- function(n){
+ if(n==0){
+ return(1)
+ }
+ res <-1
+ for(i in 1:n){
+ res<- res *i
+ }
+ return(res)
+ }
> myfact(5)
[1] 120
> myfact(0)
[1] 1
> f <- function(a,b){
+ print(a)
+ print(b)
+ }
> f(10,20)
[1] 10
[1] 20
> f(b=10,a=20)
[1] 20
[1] 10
가변 인수 함수
인수의 개수가 변하는
표현 : (...) 점 3개
> f2 <- function(...){
+ myArgs <- list(...)
+ for(i in myArgs){
+ print(i)
+ }
+ }
> f2(1,2,3,4)
[1] 1
[1] 2
[1] 3
[1] 4
> f2("!","G")
[1] "!"
[1] "G"
-> 인수의 개수 상관없이 다 받아진다.
중첩 함수
함수 내에 또 다른 함수가 정의되어져 있는 함수
> f2 <- function(a,b){
+ print(a)
+ g2<-function(b){
+ print(b)
+ }
+ g2(b)
+ }
> f2(10,20)
[1] 10
[1] 20
> f3 <- function(a,b){
+ print(a)
+ g3(b)
+ g3<-function(b){
+ print(b)
+ }
+ }
> f3(10,20)
[1] 10
Error in f3(10, 20) : could not find function "g3"
-> 인터프리터, g3함수 정의가 g3함수 선언 다음에 있어서 실행안된다.
> f4<-function(x1){
+ return(function(x2){
+ return(x1+x2)
+ })
+ }
> g <- f4(1)
> g(2)
[1] 3
>