setwd('c:/users/is2js/R_da/')

# for 반복문은 쉽지만, 속도가 느리다는 단점이 있다. 그것을 대체할 함수가 2개이다.
# 1. apply()
# 2. ifelse()

# ifelse( test = 특정 칼럼(?)에 대한 조건, yes = 참일 경우, no = 거짓일 경우 ) 의 형태이다.
image

# apply() -> 파생된 함수 lapply(), sapply() 등
# - apply( X = df, MARGIN = 1, FUN = "sum")
# apply()함수는 MARGIN인자가 계산 방향이다.
# MARGIN = 1 : 가로방향(행 방향)  #(파이썬은 세0가1 , R은 세2가1)
# MARGIN = 2 : 세로방향(칼럼 방향)

image

# sapply() : apply() + MARGIN = 2(세로방향) 의 함수다. (세2가1)
# 엄청 자주 사용하는 함수이다. 세로방향 s!
# - sapply(df, "sum")   : 칼럼별로 합계 확인
# - sapply(df, "class") : 세로방향(칼람별로) 속성확인


실 습


set.seed(1228)
df = data.frame(aa = 1:6,
                 bb = sample(c("a","b"),
                             size = 6,
                             replace = TRUE)) # 2개인데도 복원추출 시켜서 6개 뽑기
df

#### ifelse() - 기준칼럼을 가지고 조건을 걸어서--> 해당칼럼에 y/n선택적 대입 ####
df[,"col_1"] = ifelse( test = df$aa == 3, # test = 기준칼럼에 대한 조건
                        yes  = 33333,       # yes = 참일 경우 대입할 값
                        no   = "무관심")    # no  = 거짓일 경우 대입할 값
df
# 만약 for문으로 짠다면?
for( n in 1:nrow(df)){
   if(df$aa == 3 ){
     df[n,"col_1"] = 33333
   }else{
     df[n,"col_1"] = "무관심"
   }
}

# ifelse()중첩해서 사용해보기
df[,"col_2"] = ifelse( test = df$aa == 3, # test = 특정칼럼에 대한 조건
                        yes = 33333,       # yes = 참일 경우 대입할 값
                        no  = ifelse( test = df$aa == 4,
                                      yes  = 44444,
                                      no   = "무관심"))   
df

# 만약 yes부분(33333, 44444)가 동일한 상태라면, 중첩을 쓰지 않고
# 1. no부분을 먼저 값을 채운 뒤
df[, "col_3"] = "무관심"
# 2.행 자리에 <칼럼인덱싱 %in% 범위(3:4)> 를 통해 더 간단히 대입할 수 있다.
df[df$aa %in% 3:4, "col_3"] = "오..."
df



#### apply() - 칼럼별(세2) or 행별(1)로 계산시 빠르다.#####
data("iris")
head(iris)
# 1. colnames() + t(t()) 를 이용하여 칼럼명 쉽게보기
t(t(colnames(iris)))
# 2. apply()는 계산하는 함수이므로, 숫자데이터만 남긴다.
df = head(iris[1:ncol(iris)-1])
# 3. 가로방향 sum
apply(X = df, MARGIN = 1, FUN = "sum")
# 4. sum을 새로운 칼럼으로 추가
df[,"sum"] = apply(X = df, MARGIN = 1, FUN = "sum")
df
df[,"mean"] = apply(X = df, MARGIN = 1, FUN = "mean")
df
# 5. 칼럼별(세2) 평균
apply(X = df, MARGIN = 2, FUN = "mean")
# 6. 소수점이 길면 반올림
round(apply(X = df, MARGIN = 2, FUN = "mean"), 4)

#### sapply() - s는 세로방향 세2 Margin2 생략 ####
sapply(X = df, FUN = "mean")
# 가장 많이 쓰는 sapply() - FUN = "class" ****
sapply(X = df, FUN = "class")
# 칼럼명뿐만 아니라 칼럼 속성도 쉽게 보기
t(t(sapply(X = df, FUN = "class") ))
# 파라미터를 생략해도된다.
t(t(sapply(df,"class") ))

+ Recent posts