데이터 전처리/R

자주 쓰이는 apply계열 함수 사용법 in r

JSMATH 2024. 6. 4. 19:58

 

apply계열 중 자주 쓰이는 3가지만 알아보겠습니다.

 

1. apply는 단일 벡터형태로는 사용불가능합니다

그러니까 'data = df$월'로 apply 적용이 안된다는 것이죠.

Margin FUN의 진행방향 [1 : row , 2 : col]
FUN 사용 할 함수
df <- read.csv('C:/Users/PJS/Documents/study/schedule.csv',fileEncoding = 'CP949')
df
> df
   시간    월    화    수  목 금
1     9 1,2,3 1,2,3     3   3 NA
2    10 1,2,3 1,2,3   1,3   3 NA
3    11   1,2 1,2,3     1     NA
4    12   1,2 1,2,3     1   3 NA
5    13     3         1,2 1,2 NA
6    14   2,3   1,2 1,2,3   3 NA
7    15   1,3   1,2         1 NA
8    16     1     3         1 NA
9    17         2,3           NA
10   18     2                 NA

#공백을 NA로 변환
apply(df, 2, function(x) ifelse(x == "", NA, x))
> apply(df, 2, function(x) ifelse(x == "", NA, x))
      시간 월      화      수      목    금
 [1,] " 9" "1,2,3" "1,2,3" "3"     "3"   NA
 [2,] "10" "1,2,3" "1,2,3" "1,3"   "3"   NA
 [3,] "11" "1,2"   "1,2,3" "1"     NA    NA
 [4,] "12" "1,2"   "1,2,3" "1"     "3"   NA
 [5,] "13" "3"     NA      "1,2"   "1,2" NA
 [6,] "14" "2,3"   "1,2"   "1,2,3" "3"   NA
 [7,] "15" "1,3"   "1,2"   NA      "1"   NA
 [8,] "16" "1"     "3"     NA      "1"   NA
 [9,] "17" NA      "2,3"   NA      NA    NA
[10,] "18" "2"     NA      NA      NA    NA

 

 

다음은 lapply입니다. 

2. lapply는 오로지 컬에 대한 FUN입니다. 다른 점은 list로 반환해 준다는 점입니다.

FUN 사용 할 함수
> lapply(df,function(x) ifelse(x == "", NA, x))
$시간
 [1]  9 10 11 12 13 14 15 16 17 18

$월
 [1] "1,2,3" "1,2,3" "1,2"   "1,2"   "3"     "2,3"   "1,3"   "1"     NA      "2"    

$화
 [1] "1,2,3" "1,2,3" "1,2,3" "1,2,3" NA      "1,2"   "1,2"   "3"     "2,3"   NA     

$수
 [1] "3"     "1,3"   "1"     "1"     "1,2"   "1,2,3" NA      NA      NA      NA     

$목
 [1] "3"   "3"   NA    "3"   "1,2" "3"   "1"   "1"   NA    NA   

$금
 [1] NA NA NA NA NA NA NA NA NA NA
 
 > lapply(df,function(x) ifelse(x == "", NA, x)) %>% typeof()
[1] "list"

 

3. sapply는 lapply와 과정은 똑같으나 출력이 다릅니다.

출력이 행렬 형태로 나온다.

> sapply(df,function(x) ifelse(x == "", NA, x))
      시간 월      화      수      목    금
 [1,] "9"  "1,2,3" "1,2,3" "3"     "3"   NA
 [2,] "10" "1,2,3" "1,2,3" "1,3"   "3"   NA
 [3,] "11" "1,2"   "1,2,3" "1"     NA    NA
 [4,] "12" "1,2"   "1,2,3" "1"     "3"   NA
 [5,] "13" "3"     NA      "1,2"   "1,2" NA
 [6,] "14" "2,3"   "1,2"   "1,2,3" "3"   NA
 [7,] "15" "1,3"   "1,2"   NA      "1"   NA
 [8,] "16" "1"     "3"     NA      "1"   NA
 [9,] "17" NA      "2,3"   NA      NA    NA
[10,] "18" "2"     NA      NA      NA    NA

> sapply(df,function(x) ifelse(x == "", NA, x)) %>% typeof()
[1] "character"

> sapply(df,function(x) ifelse(x == "", NA, x)) %>% is.matrix()
[1] TRUE