[R 기초] 데이터 다루기(2) - apply 함수

2020. 10. 24. 19:25노트/R : 통계

 

 

# 데이터 생성 
subject_name <- c("John","Jane","Steve")
temp <- c(37,35,33)
flu_status <- c(TRUE,FALSE,FALSE)
temp
# [1] 37 35 33
temp[2:3] # [1] 35 33
temp[-2] # [1] 37 33
temp[c(TRUE,FALSE,TRUE)] # [1] 37 33
#factor : 명목형 데이터를 표현 
gender<-factor(c("M","F","M"))
gender

blood <- factor(c("O","AB","A"),
                levels = c("O","AB","A","B"))
blood

factor(c("A","F","C"),
       levels = c("A","B","C","D","F"),
       ordered=TRUE)

# 리스트: 순서 x , 타입이 다양 
sbl<-list(fn= subject_name[1],
     temp= temp[1],
     flu = flu_status[1])
sbl

sbl$fn # [1] "John"
class(sbl[1]) # [1] "list"
class(sbl[[1]]) # [1] "character"

sbl[c("temp","flu")]

df <- data.frame(sbl,stringAsFactors = FALSE)
#StringAsFactors : 팩터형으로 문자열을 읽을 것인가? 
str(df)

 

 

 

apply 계열 함수 
: 함수 연산을 특정 단위로 쉽게 할 수있도록 지원해주는 함수 
- for, while (소규모 데이터 반복 연산 )
- apply (대규모 데이터 반복 연산)

 

데이터 

iris_num <- NULL
iris

class(iris) # [1] "data.frame"
str(iris)

 

 

iris 데이터에서 numeric 데이터만 추출하고 싶을때 

 

방법1. for문 이용

ncol(iris) # columns의 갯수 확인 
# [1] 5

for ( x in 1:ncol(iris)){
  if(is.numeric(iris[,x])) # sample data가 numeric인지? 
    iris_num <-cbind(iris_num,iris[,x]) # columns 연결 
}

class(iris_num) # [1] "matrix"
iris_num <- data.frame(iris_num)
class(iris_num) #[1] "data.frame"

 

방법2. sapply 이용 

iris_num <- iris[,sapply(iris,is.numeric)]
class(iris_num) # [1] "data.frame"

 

iris_num <- iris[1:10, 1:4]
set.seed(123) # 난수 시드값 설정 
idx_r <- sample(1:10,2) # 실행할 때마다 1~10까지 임의의 숫자 2개 추출 
idx_c <- sample(1:4,2)

idx_r # [1]  3 10
idx_c # [1] 3 4
for (i in 1:2){
  iris_num[idx_r[i], idx_c[i]]<-NA
}

iris_num

 

 

apply: 행(1) 또는 열(2) 단위 연산(MARGIN)
입력 : 배열, 매트릭스 (같은 변수 형으로 )
출력 : 매트릭스 또는 벡터

apply(iris_num, 1 , mean)

apply(iris_num, 2 ,mean,na.rm=T)

apply(iris_num,2, function(x){x*2+1}) # 함수 정의

apply(iris_num, 2, function(x){median(x*2+1, na.rm=T)})

lapply: list+apply => 실행결과가 list로 출력 
* 데이터 프레임 : 모든 변수가 벡터형태여야 함 
변수의 type이 같아야함 

class(apply(iris_num,2,mean,na.rm=T)) # [1] "numeric"

class(lapply(iris_num,mean,na.rm=T))
# [1] "list"

 

sapply: lapply와 비슷하나 간단하게 기술가능하고, 연산 결과가 벡터로 나옴(길이가 다른 경우 리스트로)

class(sapply(iris_num,mean, na.rm=T))
# [1] "numeric": vector 

class(sapply(iris_num, mean, na.rm=T, simplify = F))
# [1] "list"

 

 

vapply: sapply + 탬플릿 지정 가능 
fivenum : 5가지 요약 수치 만들어주는 함수 
- 최솟값, 1사분위수, 중위값, 3사분위수, 최댓값 

 

sapply(iris_num, fivenum)

vapply(iris_num, fivenum, c("Min."=0,"1st."=0,"Med."=0,"3rd."=0,"Max."=0))