벡터의 원소에는 이름을 붙일 수 있어요. 그러면 다룰 때 더 편리할 때가 많아요.
벡터에 이름을 추가하는 방법은 세 가지가 있어요.
> work_days <- c(Mon = TRUE, Tue = TRUE, Wed = TRUE, Thu = TRUE, Fri = TRUE, Sat = FALSE, Sun = FALSE)
> work_days
Mon Tue Wed Thu Fri Sat Sun
TRUE TRUE TRUE TRUE TRUE FALSE FALSE
names()에 문자형 벡터를 할당할 때> months <- c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
> names(months) <- month.abb
> months
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
31 28 31 30 31 30 31 31 30 31 30 31
setNames()를 사용할 때> months <- c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
> setNames(months, month.name)
January February March April May June July August September October November December
31 28 31 30 31 30 31 31 30 31 30 31
이름이 더 이상 필요 없다면 NULL로 설정해서 제거할 수 있어요.
> work_days
Mon Tue Wed Thu Fri Sat Sun
TRUE TRUE TRUE TRUE TRUE FALSE FALSE
> names(work_days) <- NULL
> work_days
[1] TRUE TRUE TRUE TRUE TRUE FALSE FALSE
unname() 함수도 같은 일을 해요. 어쩌면 의도를 더 분명하게 보여줄 수도 있어요.
names() 함수는 이름을 설정할 수도 있고 가져올 수도 있어요.
> names(months) <- month.abb
> names(months)[1:3]
[1] "Jan" "Feb" "Mar"
위치 인덱스 대신 이름을 사용할 수 있어요. 이때는 따옴표가 필요해요.
> months[c("Jul", "Aug")]
Jul Aug
31 31
이런 인덱싱이 제대로 동작하게 하려면 이름이 중복되지 않고 빠진 이름도 없도록 하는 게 좋아요. 하지만 R이 중복을 강제로 막지는 않아요.
일반적인 벡터 연산도 그대로 동작하고, 말이 되는 경우라면 이름도 보통 그대로 유지돼요.
> months[months == 30]
Apr Jun Sep Nov
30 30 30 30
> sum(months)
[1] 365 # no meaningful names possible
vectors를 비롯한 많은 R 객체에는 임의의 속성을 붙일 수 있어요. names 속성도 그중 하나일 뿐이지만, 특히 흔하고 중요한 예시예요.
실제로 이름은 벡터에서 가끔 유용하지만 꼭 필요한 경우는 거의 없어요. names-attribute는 lists와 dataframes처럼 더 복잡한 구조에서 훨씬 중요해져요. 앞으로 나올 개념에서 살펴볼게요.