객체 및 해당 객체의 변수 속성을 간단한 함수 부터 고급 응용까지 알아보자.
기본
첫 번째 데이터는 iris 데이터이다. 데이터를 확인해보자.
1 | df1 = iris |
객체 속성을 확인하는 함수는 class()
. 역시 데이터프레임인 것을 바로 알 수 있다.
1 | class(df1) |
속성 확인 관련해서는 typeof()
라는 함수도 있는데 보다 깊숙한 정보를 알려준다고 보면 되겠다. 사실 데이터프레임은 list의 일종이다.
1 | typeof(df1) |
그럼 이제 객체 말고 각 변수의 속성을 알아보자. 가장 쉬운 방법은 아무래도 객체 구조를 보는 str()
함수가 적절하다. 하지만 부가적으로 출력되는 정보가 너무 많다.
1 | str(df1) |
물론 for 반복문으로 보는 방법도 있지만 생략한다.
중급
각 row 또는 column 방향으로 일괄 연산하는 apply()
함수를 사용하면 다음과 같다.
1 | apply(df1, MARGIN = 2, FUN = "class") |
Species 변수가 factor지만 어쩐 일인지 모든 변수가 문자형(character)으로 표출된다. 이 때는 다음과 같이 Simplified Apply Function인 sapply()
함수 사용을 권장한다. 다음과 같이 개별 변수 속성을 잘 확인할 수 있다.
1 | sapply(df1, FUN = "class") |
apply()
함수와 sapply()
함수가 내부 연산 코드가 살짝 달라서 나타나는 문제이고 보통 수치연산에서는 문제될 일이 없다고 보면 된다.
고급
앞서 소개한 iris의 경우 각 변수당 지정된 속성이 하나인 경우는 괜찮지만, 두 개 이상인 경우는 어떨까? ggplot2 패키지의 diamonds 데이터로 실습을 해보자.
1 | library("ggplot2") |
cut, color, clarity를 제외한 나머지 변수는 수치형으로 보인다. 그럼 이제 sapply()
로 확실하게 확인해보자.
1 | sapply(df2, FUN = "class") |
cut, color, clarity 변수의 속성이 순서형 변수로 factor와 ordered를 동시에 가지고 있고 ordered가 우선시(앞에 위치)되는 것을 알 수 있다.
마지막으로 가장 어려운 코드를 작성하기 전에 특정 list에서 첫 번째 원소를 뽑아내는 코드를 살펴보자.
1 | list_classes = sapply(df2, FUN = "class") |
대괄호 2개로 하위 list에 접근하고 [1]
을 사용하여 해당 list의 첫 번째 원소에 접근하는 코드를 작성할 수 있다. 이 코드를 list 객체의 각 하위 list에 일괄 적용할 예정이기 때문에 list객체 전용 함수인 lapply()
를 사용할 수 있다. 그리고 출력물이 list가 되면 아래로 길게 늘어져서 보기가 번거로우니 list구조를 풀어주는 unlist()
함수 까지 같이 적용하면 다음과 같다.
1 | unlist(lapply(sapply(df2, FUN = "class"), FUN = "[", 1)) |
보통 특정 변수에 할당된 속성이 여러개일지라도 첫 번째 원소의 것만 보면 대충 어떤 속성인지 알기에 이정도만 해도 만족하는 분이 있고, 그래도 전체 속성을 다 가져와서 보길 원하는 사람도 있다. 그렇다면 paste()
함수를 활용해서 각 원소를 이어붙여보자.
1 | unlist(lapply(sapply(df2, FUN = "class"), FUN = "paste", collapse = "_")) |
이 경우에는 원소를 이어붙일 때 sep 인자가 동작하지 않기 때문에 collapse를 활용하여 언더바(_)로 각 값을 이어주었다.