ADsP R기초

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

데이터프레임 색인

데이터 프레임을 다루는 법은 복잡하고, 시험에 매우 자주 나옵니다. 데이터 프레임에서 원하는 정보만 뽑아낼 수 있어야 하고요. 데이터 프레임을 쪼개거나, 합치거나, 함수를 적용할 줄도 알아야 합니다. 혹시 SQL 데이터베이스를 아시는 분이라면 그거랑 매우 비슷합니다. 하나씩 알아봅시다.

 

혹시 중간에 행이랑 열이 헷갈리시면 지난 강좌를 다시 봐주세요.

 

먼저 색인입니다. 벡터처럼 데이터 프레임도 원하는 행이나 열만 선택할 수 있습니다. 다만 벡터는 1차원인데, 데이터프레임은 2차원입니다. 당연히 색인도 2중으로 할 수 있습니다.

이번에는 MASS 라이브러리에 내장된 다른 데이터인 Car93을 사용해보겠습니다. Cars93은 자동차들의 모델명부터 차종, 가격, 엔진 크기까지 다양한 데이터를 담고 있습니다. iris와 달리 매우 복잡하죠. 역시 시험에 자주 나옵니다.

> library(MASS) #라이브러리를 먼저 불러오고
> data("Cars93") #데이터를 불러옵니다.
> head(Cars93) #첫 6개 행만 보겠습니다. 이것만 봐도 머리 아프게 복잡하거든요.
  Manufacturer   Model    Type Min.Price Price Max.Price MPG.city MPG.highway
1        Acura Integra   Small      12.9  15.9      18.8       25          31
2        Acura  Legend Midsize      29.2  33.9      38.7       18          25
3         Audi      90 Compact      25.9  29.1      32.3       20          26
4         Audi     100 Midsize      30.8  37.7      44.6       19          26
5          BMW    535i Midsize      23.7  30.0      36.2       22          30
6        Buick Century Midsize      14.2  15.7      17.3       22          31
             AirBags DriveTrain Cylinders EngineSize Horsepower  RPM Rev.per.mile
1               None      Front         4        1.8        140 6300         2890
2 Driver & Passenger      Front         6        3.2        200 5500         2335
3        Driver only      Front         6        2.8        172 5500         2280
4 Driver & Passenger      Front         6        2.8        172 5500         2535
5        Driver only       Rear         4        3.5        208 5700         2545
6        Driver only      Front         4        2.2        110 5200         2565
  Man.trans.avail Fuel.tank.capacity Passengers Length Wheelbase Width Turn.circle
1             Yes               13.2          5    177       102    68          37
2             Yes               18.0          5    195       115    71          38
3             Yes               16.9          5    180       102    67          37
4             Yes               21.1          6    193       106    70          37
5             Yes               21.1          4    186       109    69          39
6              No               16.4          6    189       105    69          41
  Rear.seat.room Luggage.room Weight  Origin          Make
1           26.5           11   2705 non-USA Acura Integra
2           30.0           15   3560 non-USA  Acura Legend
3           28.0           14   3375 non-USA       Audi 90
4           31.0           17   3405 non-USA      Audi 100
5           27.0           13   3640 non-USA      BMW 535i
6           28.0           16   2880     USA Buick Century

열 이름 확인하기

일단 열이 너무 많으니 몇 개만 골라서 보고 싶습니다. 일단 열 이름이 뭐가 있는지 지난 시간에 나왔던 colnames를 써서 확인합니다. 열이 27개나 됩니다.

> colnames(Cars93)
 [1] "Manufacturer"       "Model"              "Type"               "Min.Price"         
 [5] "Price"              "Max.Price"          "MPG.city"           "MPG.highway"       
 [9] "AirBags"            "DriveTrain"         "Cylinders"          "EngineSize"        
[13] "Horsepower"         "RPM"                "Rev.per.mile"       "Man.trans.avail"   
[17] "Fuel.tank.capacity" "Passengers"         "Length"             "Wheelbase"         
[21] "Width"              "Turn.circle"        "Rear.seat.room"     "Luggage.room"      
[25] "Weight"             "Origin"             "Make"              

#열의 개수는 length함수를 써서 알 수 있습니다.
> length(colnames(Cars93))
[1] 27
#사실 그냥 데이터프레임의 길이를 재면, 알아서 가로길이 = 열의 개수를 반환합니다.
> length(Cars93)
[1] 27

기출 연습 문제

다음 중 데이터 프레임의 열 이름을 붙이는 함수는 무엇인가?

1. culname()

2. rownames()

3. colname()

4. colnames()

열 이름으로 색인하기

벡터와 마찬가지로 []를 이용합니다.

# 그냥 열 이름만 쓰면 한 개 열만 데이터프레임으로 똑 잘라서 반환합니다. 세로로 길죠.
# 직접 실행해서 결과를 보세요.
> Cars93["Make"]

# 데이터 프레임 옆에 $ 기호를 쓰고 변수명을 적어주는 것도 비슷한 뜻입니다.
# 차이점은... 결과가 데이터프레임이 아니라, 벡터로 반환된다는 건데요. 가로로 길죠.
> Cars93$Make

여러 열을 선택하려면 []안에 선택할 열 이름들을 적은 벡터를 넣어주면 됩니다.

> colSelect <- c("Make", "Type", "Price", "MPG.city", "Horsepower")
SelectedCar93 <- Cars93[colSelect]
> head(SelectedCar93)
           Make    Type Price MPG.city Horsepower
1 Acura Integra   Small  15.9       25        140
2  Acura Legend Midsize  33.9       18        200
3       Audi 90 Compact  29.1       20        172
4      Audi 100 Midsize  37.7       19        172
5      BMW 535i Midsize  30.0       22        208
6 Buick Century Midsize  15.7       22        110

순번으로 색인하기

열 이름 대신 벡터처럼 숫자로 색인할 수도 있습니다. 예를 들어 차종(Type)은 3번째 열이죠. 콤마 뒤에 숫자를 써줍니다. 결과는 벡터로 반환합니다. 가로로 길죠.

> Cars93[,3]
[1] Small   Midsize Compact Midsize Midsize Midsize ...
Levels: Compact Large Midsize Small Sporty Van

#괄호를 두 번 쓰는 것도 똑같은 뜻입니다. 이따금 시험에 나옵니다.
> Cars93[[3]]
[1] Small   Midsize Compact Midsize Midsize Midsize ...
Levels: Compact Large Midsize Small Sporty Van
# 그러면 왜 [[]]를 두 번 쓸까요?
# []를 콤마 없이 한 번만 쓰면 벡터가 아니라 데이터 프레임을 반환하기 때문입니다. 세로로 길죠.
> Cars93[3]
      Type
1    Small
2  Midsize
3  Compact
4  Midsize
5  Midsize
6  Midsize
7    Large
...

특정한 행(row) 하나를 조회하려면 콤마 (,) 앞쪽에 숫자를 써줍니다. 예를 들어 다음 코드는 3번째 자동차의 모든 데이터를 불러옵니다. 단 이 결과는 무조건 데이터 프레임입니다. 왜냐하면 벡터는 동질적이어야 하는데요. 데이터 프레임은 열끼리는 동질적이지만, 행끼리는 동질적이지 않습니다. 한 행을 자르면 여러 종류의 데이터가 있다는 뜻이죠.

> Cars93[3,]
  Manufacturer Model    Type Min.Price Price Max.Price MPG.city MPG.highway     AirBags DriveTrain
3         Audi    90 Compact      25.9  29.1      32.3       20          26 Driver only      Front
  Cylinders EngineSize Horsepower  RPM Rev.per.mile Man.trans.avail Fuel.tank.capacity Passengers
3         6        2.8        172 5500         2280             Yes               16.9          5
  Length Wheelbase Width Turn.circle Rear.seat.room Luggage.room Weight  Origin    Make
3    180       102    67          37             28           14   3375 non-USA Audi 90

논리벡터 색인

그리고 이 색인은 논리 벡터랑 같이 쓸 수 있습니다. 다음 명령을 수행하면 이 차를 Audi에서 만들었는지 판단하는 논리벡터를 반환합니다.

IsManufacturerAudi <- Cars93$Manufacturer == "Audi"
> IsManufacturerAudi
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE ...

이걸 [] 안에 넣어주면 아우디에서 만든 차만 볼 수 있습니다. 보통 한 번에 이렇게 씁니다. 콤마(,)를 꼭 찍어줘야 합니다.

> Cars93[Cars93$Manufacturer == "Audi",]
  Manufacturer Model    Type Min.Price Price Max.Price MPG.city MPG.highway            AirBags
3         Audi    90 Compact      25.9  29.1      32.3       20          26        Driver only
4         Audi   100 Midsize      30.8  37.7      44.6       19          26 Driver & Passenger

마찬가지로 가격이 40.0 이상인 차만 보려면 이렇게 합니다.

> Cars93[Cars93$Price > 40.0 ,]
    Manufacturer   Model    Type Min.Price Price Max.Price MPG.city MPG.highway            AirBags
11      Cadillac Seville Midsize      37.5  40.1      42.7       16          25 Driver & Passenger
48      Infiniti     Q45 Midsize      45.4  47.9      50.4       17          22        Driver only
59 Mercedes-Benz    300E Midsize      43.8  61.9      80.0       19          25 Driver & Passenger

 

색인은 많이 어렵습니다. 다양하게 써보고 반복해서 익히시길 바랍니다. 아니면 시험에 나오는 기출 문제만 풀어보는 것도 괜찮습니다.

기출 연습문제

다음 중 Cars93에서 다른 결과를 반환하는 것은? (단 벡터인지 데이터 프레임인지는 상관 없다.)

  1. Cars93[[5]]
  2. Cars93["Price"]
  3. Cars93[5,]
  4. Cars93[5]
  5. Cars93$Price

댓글

댓글 본문
버전 관리
Taehee Kim
현재 버전
선택 버전
graphittie 자세히 보기