R에서 큰 개념이에요. 가능한 것들을 이해하는 데 도움이 되도록, 여러 함수의 입력과 출력이 몇 차원인지 생각해 보면 유용해요.
벡터를 받아 하나의 스칼라 같은 값을 반환하는 함수는 이미 봤어요:
> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15
mean()처럼 많은 통계 함수도 여기에 속해요.
논리 벡터에는 all()과 any()가 있어요.
R의 많은 함수는 벡터 전체에 작동하며, 흔히 벡터를 결과로 내놓아요. 대부분의 수학 함수가 그렇죠:
> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5
이런 방식은 간결하고 편리할 뿐만 아니라, 다른 언어에서 흔히 쓰는 루프나 리스트 컴프리헨션, 재귀를 쓸 필요도 없어요. R에서는 벡터 함수가 그런 기법보다 훨씬 빠르게 실행되는 경우가 많아요.
벡터를 정렬할 때는 값을 반환하는 sort()와 인덱스를 반환하는 order()가 있어요:
> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am" "I" "in" "not" "order"
> order(v)
#> [1] 2 1 4 3 5
기본값은 오름차순 정렬이에요.
필요하면 decreasing = TRUE를 지정하거나, 기존 벡터를 뒤집을 때는 rev()를 사용해요.
v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not" "in" "I" "am"
rev(1:4)
#> [1] 4 3 2 1
입력 벡터를 왼쪽에서 오른쪽으로 처리하면서 누적된 값을 벡터로 만들어 주는 함수도 있어요:
> cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
> cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
이 개념을 확장하면 벡터를 비교할 때도 활용할 수 있어요.
예를 들어 각 쌍의 최댓값을 구하는 함수 pmax()를 살펴봐요:
> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
지난 7일 동안 정원에 찾아온 새가 몇 마리인지 기록해 온 열렬한 탐조가예요.
앞으로 풀어야 할 과제는 여섯 개이고, 모두 정원에 찾아온 새의 수와 관련된 내용이에요.
today() 함수를 구현해요. 이 함수는 오늘 정원에 찾아온 새가 몇 마리인지 반환해요. 새의 수는 날짜 순으로 정렬되어 있어요. 첫 번째 원소는 가장 오래된 날의 수이고, 마지막 원소는 오늘의 수예요.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1
increment_todays_count() 함수를 구현해 오늘의 수를 늘려요:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)
has_day_without_birds() 함수를 구현해요. 정원에 새가 한 마리도 찾아오지 않은 날이 있으면 TRUE를 반환하고, 그렇지 않으면 FALSE를 반환해요:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true
count_for_first_days() 함수를 구현해요. 이 함수는 이번 주가 시작된 이후 정원에 찾아온 새의 수를 반환하되, 세는 범위는 이번 주 시작부터 지정한 일수까지만으로 제한해요.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14
어떤 날은 다른 날보다 더 바빠요. 바쁜 날은 정원에 다섯 마리 이상의 새가 찾아온 날이에요.
busy_days() 함수를 구현해 바쁜 날의 수를 반환해요:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2
이번 주에 지금까지 새가 모두 몇 마리 찾아왔는지 궁금해요. 날짜별 누적 합계를 계산해요.
running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1] 7 13 18 22 25 27 28
새의 방문이 근처 도로 교통 패턴의 영향을 받아서, 주말과 평일이 서로 다르다고 생각해요.
방문한 새의 수를 기준으로 요일 약어를 _내림차순_으로 정렬해요.
day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
Exercism에 가입하고 R 트랙을 개념 21개연습 문제 111개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.