01. 다음과 같이 리스트,행렬, 데이터프레임을 생성하고 길이를 비교하시오(length() 함수 이용)

lst <- list(1:12)
mtx <- matrix(1:12,nrow=4)
df <- data.frame(x=1:4,y=5:8,z=9:12)
# R code와 설명을 #와 함께 입력하시오
lst <- list(1:12)
length(lst)  # 리스트의 길이
## [1] 1
mtx <- matrix(1:12,nrow=4)
length(mtx)  # 행렬의 길이
## [1] 12
df <- data.frame(x=1:4,y=5:8,z=9:12)
length(df)   # 데이터 프레임의 길이
## [1] 3

02. 다음 중 실행 결과가 다른 것을 고르시오.

mtcars[1:4]
mtcars[,1:4]
mtcars[-c(5,6,7,8,9,10,11)]
mtcars[c("mpg","cyl","disp","hp")]
mtcars[-5:11]   # 실행결과 다름!
mtcars[1:4]
##                      mpg cyl  disp  hp
## Mazda RX4           21.0   6 160.0 110
## Mazda RX4 Wag       21.0   6 160.0 110
## Datsun 710          22.8   4 108.0  93
## Hornet 4 Drive      21.4   6 258.0 110
## Hornet Sportabout   18.7   8 360.0 175
## Valiant             18.1   6 225.0 105
## Duster 360          14.3   8 360.0 245
## Merc 240D           24.4   4 146.7  62
## Merc 230            22.8   4 140.8  95
## Merc 280            19.2   6 167.6 123
## Merc 280C           17.8   6 167.6 123
## Merc 450SE          16.4   8 275.8 180
## Merc 450SL          17.3   8 275.8 180
## Merc 450SLC         15.2   8 275.8 180
## Cadillac Fleetwood  10.4   8 472.0 205
## Lincoln Continental 10.4   8 460.0 215
## Chrysler Imperial   14.7   8 440.0 230
## Fiat 128            32.4   4  78.7  66
## Honda Civic         30.4   4  75.7  52
## Toyota Corolla      33.9   4  71.1  65
## Toyota Corona       21.5   4 120.1  97
## Dodge Challenger    15.5   8 318.0 150
## AMC Javelin         15.2   8 304.0 150
## Camaro Z28          13.3   8 350.0 245
## Pontiac Firebird    19.2   8 400.0 175
## Fiat X1-9           27.3   4  79.0  66
## Porsche 914-2       26.0   4 120.3  91
## Lotus Europa        30.4   4  95.1 113
## Ford Pantera L      15.8   8 351.0 264
## Ferrari Dino        19.7   6 145.0 175
## Maserati Bora       15.0   8 301.0 335
## Volvo 142E          21.4   4 121.0 109
mtcars[,1:4]
##                      mpg cyl  disp  hp
## Mazda RX4           21.0   6 160.0 110
## Mazda RX4 Wag       21.0   6 160.0 110
## Datsun 710          22.8   4 108.0  93
## Hornet 4 Drive      21.4   6 258.0 110
## Hornet Sportabout   18.7   8 360.0 175
## Valiant             18.1   6 225.0 105
## Duster 360          14.3   8 360.0 245
## Merc 240D           24.4   4 146.7  62
## Merc 230            22.8   4 140.8  95
## Merc 280            19.2   6 167.6 123
## Merc 280C           17.8   6 167.6 123
## Merc 450SE          16.4   8 275.8 180
## Merc 450SL          17.3   8 275.8 180
## Merc 450SLC         15.2   8 275.8 180
## Cadillac Fleetwood  10.4   8 472.0 205
## Lincoln Continental 10.4   8 460.0 215
## Chrysler Imperial   14.7   8 440.0 230
## Fiat 128            32.4   4  78.7  66
## Honda Civic         30.4   4  75.7  52
## Toyota Corolla      33.9   4  71.1  65
## Toyota Corona       21.5   4 120.1  97
## Dodge Challenger    15.5   8 318.0 150
## AMC Javelin         15.2   8 304.0 150
## Camaro Z28          13.3   8 350.0 245
## Pontiac Firebird    19.2   8 400.0 175
## Fiat X1-9           27.3   4  79.0  66
## Porsche 914-2       26.0   4 120.3  91
## Lotus Europa        30.4   4  95.1 113
## Ford Pantera L      15.8   8 351.0 264
## Ferrari Dino        19.7   6 145.0 175
## Maserati Bora       15.0   8 301.0 335
## Volvo 142E          21.4   4 121.0 109
mtcars[-c(5,6,7,8,9,10,11)]
##                      mpg cyl  disp  hp
## Mazda RX4           21.0   6 160.0 110
## Mazda RX4 Wag       21.0   6 160.0 110
## Datsun 710          22.8   4 108.0  93
## Hornet 4 Drive      21.4   6 258.0 110
## Hornet Sportabout   18.7   8 360.0 175
## Valiant             18.1   6 225.0 105
## Duster 360          14.3   8 360.0 245
## Merc 240D           24.4   4 146.7  62
## Merc 230            22.8   4 140.8  95
## Merc 280            19.2   6 167.6 123
## Merc 280C           17.8   6 167.6 123
## Merc 450SE          16.4   8 275.8 180
## Merc 450SL          17.3   8 275.8 180
## Merc 450SLC         15.2   8 275.8 180
## Cadillac Fleetwood  10.4   8 472.0 205
## Lincoln Continental 10.4   8 460.0 215
## Chrysler Imperial   14.7   8 440.0 230
## Fiat 128            32.4   4  78.7  66
## Honda Civic         30.4   4  75.7  52
## Toyota Corolla      33.9   4  71.1  65
## Toyota Corona       21.5   4 120.1  97
## Dodge Challenger    15.5   8 318.0 150
## AMC Javelin         15.2   8 304.0 150
## Camaro Z28          13.3   8 350.0 245
## Pontiac Firebird    19.2   8 400.0 175
## Fiat X1-9           27.3   4  79.0  66
## Porsche 914-2       26.0   4 120.3  91
## Lotus Europa        30.4   4  95.1 113
## Ford Pantera L      15.8   8 351.0 264
## Ferrari Dino        19.7   6 145.0 175
## Maserati Bora       15.0   8 301.0 335
## Volvo 142E          21.4   4 121.0 109
mtcars[c("mpg","cyl","disp","hp")]
##                      mpg cyl  disp  hp
## Mazda RX4           21.0   6 160.0 110
## Mazda RX4 Wag       21.0   6 160.0 110
## Datsun 710          22.8   4 108.0  93
## Hornet 4 Drive      21.4   6 258.0 110
## Hornet Sportabout   18.7   8 360.0 175
## Valiant             18.1   6 225.0 105
## Duster 360          14.3   8 360.0 245
## Merc 240D           24.4   4 146.7  62
## Merc 230            22.8   4 140.8  95
## Merc 280            19.2   6 167.6 123
## Merc 280C           17.8   6 167.6 123
## Merc 450SE          16.4   8 275.8 180
## Merc 450SL          17.3   8 275.8 180
## Merc 450SLC         15.2   8 275.8 180
## Cadillac Fleetwood  10.4   8 472.0 205
## Lincoln Continental 10.4   8 460.0 215
## Chrysler Imperial   14.7   8 440.0 230
## Fiat 128            32.4   4  78.7  66
## Honda Civic         30.4   4  75.7  52
## Toyota Corolla      33.9   4  71.1  65
## Toyota Corona       21.5   4 120.1  97
## Dodge Challenger    15.5   8 318.0 150
## AMC Javelin         15.2   8 304.0 150
## Camaro Z28          13.3   8 350.0 245
## Pontiac Firebird    19.2   8 400.0 175
## Fiat X1-9           27.3   4  79.0  66
## Porsche 914-2       26.0   4 120.3  91
## Lotus Europa        30.4   4  95.1 113
## Ford Pantera L      15.8   8 351.0 264
## Ferrari Dino        19.7   6 145.0 175
## Maserati Bora       15.0   8 301.0 335
## Volvo 142E          21.4   4 121.0 109
# mtcars[-5:11]  # Error

03. 다음 세 벡터를 이용하여 데이터프레임을 생성하고, gender변수의 값(level숫자값)을 반대 성별로 변경하시오. 그리고 name변수는 문자, gender변수는 팩터, math변수는 숫자 데이터 유형이라는 것을 확인하시오.

name <- c("Potter", "Elsa", "Gates", "Wendy", "Ben")
gender <- factor(c("F", "M", "F", "M", "F"))
math <- c(85, 76, 99, 88, 67)
name <- c("Potter", "Elsa", "Gates", "Wendy", "Ben")
gender <- factor(c("F", "M", "F", "M", "F"))
math <- c(85, 76, 99, 88, 67)
df <- data.frame(name,gender,math) # 데이터 프레임 생성
df
##     name gender math
## 1 Potter      F   85
## 2   Elsa      M   76
## 3  Gates      F   99
## 4  Wendy      M   88
## 5    Ben      F   67
df$gender
## [1] F M F M F
## Levels: F M
levels(df$gender) <- c('M','F')  # gender 변수의 값(level 숫자 값)을 반대 성별로 변경
df$gender
## [1] M F M F M
## Levels: M F
is.character(name) 
## [1] TRUE
is.factor(gender)
## [1] TRUE
is.numeric(math)
## [1] TRUE

04. 3번 문제에서 생성한 데이터프레임 df에 대해 다음 작업을 수행하시오.

  1. 아래와 같이 stat변수를 데이터프레밈 df에 추가하시오.
  2. math 변수와 stat변수의 평균을 구하여 df내 score변수로 저장하시오(소수 첫째 자리로 반올림 계산. 반올림 계산은 round()를 이용하시오)
  3. 논리 연산 인덱싱을 이용하여 score가 90이상이면 A, 80이상 90미만이면 B, 70이상 80미만이면 C, 70미만이면 D로 등급을 부여하고 grade 변수에 저장하시오.
  4. grade변수를 서열 팩터로 변환하시오
stat <- c(76,73,95,82,55)
# (a) stat변수를 데이터프레밈 df에 추가하시오.
stat <- c(76,73,95,82,55)
df <- cbind(df, stat)
df
##     name gender math stat
## 1 Potter      M   85   76
## 2   Elsa      F   76   73
## 3  Gates      M   99   95
## 4  Wendy      F   88   82
## 5    Ben      M   67   55
# (b) math 변수와 stat변수의 평균을 구하여 df내 score변수로 저장하시오
df$score <- round(rowMeans(df[3:4]),1)
df
##     name gender math stat score
## 1 Potter      M   85   76  80.5
## 2   Elsa      F   76   73  74.5
## 3  Gates      M   99   95  97.0
## 4  Wendy      F   88   82  85.0
## 5    Ben      M   67   55  61.0
# (c) score가 90이상이면 A, 80이상 90미만이면 B, 70이상 80미만이면 C, 70미만이면 D로 등급을 부여하고 grade 변수에 저장하시오. 
df$grade[df$score >= 90] <- "A"
df$grade[df$score>=80 & df$score<90] <- "B"
df$grade[df$score>=70 & df$score<80] <- "C"
df$grade[df$score<70] <- "D"
df
##     name gender math stat score grade
## 1 Potter      M   85   76  80.5     B
## 2   Elsa      F   76   73  74.5     C
## 3  Gates      M   99   95  97.0     A
## 4  Wendy      F   88   82  85.0     B
## 5    Ben      M   67   55  61.0     D
# (d) grade변수를 서열 팩터로 변환하시오
df$grade
## [1] "B" "C" "A" "B" "D"
df$grade <- factor(df$grade)
df$grade
## [1] B C A B D
## Levels: A B C D

05. iris 데이터셋에 대해 다음 작업을 수행하시오.

  1. iris 데이터셋의 데이터 구조를 확인하고 숫자 변수만으로 구성된 새로운 데이터 프레임 iris.new를 생성하시오.
  2. 새로운 데이터프레임 iris.new의 열 평균을 구하시오
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
iris.new <- data.frame(iris[,1:4])
head(iris.new)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1          5.1         3.5          1.4         0.2
## 2          4.9         3.0          1.4         0.2
## 3          4.7         3.2          1.3         0.2
## 4          4.6         3.1          1.5         0.2
## 5          5.0         3.6          1.4         0.2
## 6          5.4         3.9          1.7         0.4
colMeans(iris.new)
## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
##     5.843333     3.057333     3.758000     1.199333

06. 표준패키지에 포함되어 있는 beaver1, beaver2 데이터셋에 대해 다음 작업을 수행하시오.

  1. 두 데이터셋의 데이터 구조를 확인하고 id 변수를 추가하여 beaver1 데이터셋에 대해서는 1을 저장하고 beaver2 데이터셋에 대해서는 2를 저장하시오.
  2. 두 데이터셋을 행의 방향으로 결합하여 새로운 데이터프레임 beaver12를 생성하고 id변수가 첫번째 열에 위치하도록 열의 순서를 조정하시오.
  3. 새로운 데이터프레임 beaver12에서 ‘active’ 상태(activ 변수값이 1)인 비버들의 서브셋(subset)을 추출하시오.
# (a) 두 데이터셋의 데이터 구조를 확인하고 id 변수를 추가하여 beaver1 데이터셋에 대해서는 1을 저장하고 beaver2 데이터셋에 대해서는 2를 저장하시오.
str(beaver1)
## 'data.frame':    114 obs. of  4 variables:
##  $ day  : num  346 346 346 346 346 346 346 346 346 346 ...
##  $ time : num  840 850 900 910 920 930 940 950 1000 1010 ...
##  $ temp : num  36.3 36.3 36.4 36.4 36.5 ...
##  $ activ: num  0 0 0 0 0 0 0 0 0 0 ...
str(beaver2)
## 'data.frame':    100 obs. of  4 variables:
##  $ day  : num  307 307 307 307 307 307 307 307 307 307 ...
##  $ time : num  930 940 950 1000 1010 1020 1030 1040 1050 1100 ...
##  $ temp : num  36.6 36.7 36.9 37.1 37.2 ...
##  $ activ: num  0 0 0 0 0 0 0 0 0 0 ...
beaver1$id <- 1
head(beaver1)
##   day time  temp activ id
## 1 346  840 36.33     0  1
## 2 346  850 36.34     0  1
## 3 346  900 36.35     0  1
## 4 346  910 36.42     0  1
## 5 346  920 36.55     0  1
## 6 346  930 36.69     0  1
beaver2$id <- 2
head(beaver2)
##   day time  temp activ id
## 1 307  930 36.58     0  2
## 2 307  940 36.73     0  2
## 3 307  950 36.93     0  2
## 4 307 1000 37.15     0  2
## 5 307 1010 37.23     0  2
## 6 307 1020 37.24     0  2
# (b) 두 데이터셋을 행의 방향으로 결합하여 새로운 데이터프레임 beaver12를 생성하고 id변수가 첫번째 열에 위치하도록 열의 순서를 조정하시오.
beaver12 <- rbind(beaver1, beaver2)
beaver12 <- beaver12[,c(5, 1:4)]
head(beaver12)
##   id day time  temp activ
## 1  1 346  840 36.33     0
## 2  1 346  850 36.34     0
## 3  1 346  900 36.35     0
## 4  1 346  910 36.42     0
## 5  1 346  920 36.55     0
## 6  1 346  930 36.69     0
# (c) 새로운 데이터프레임 beaver12에서 'active' 상태(activ 변수값이 1)인 비버들의 서브셋(subset)을 추출하시오.
subset(beaver12,beaver12$activ==1)
##     id day time  temp activ
## 54   1 346 1730 37.07     1
## 68   1 346 1950 37.10     1
## 80   1 346 2150 37.53     1
## 83   1 346 2230 37.25     1
## 86   1 346 2300 37.24     1
## 114  1 347  340 37.15     1
## 153  2 307 1550 37.98     1
## 154  2 307 1600 38.02     1
## 155  2 307 1610 38.00     1
## 156  2 307 1620 38.24     1
## 157  2 307 1630 38.10     1
## 158  2 307 1640 38.24     1
## 159  2 307 1650 38.11     1
## 160  2 307 1700 38.02     1
## 161  2 307 1710 38.11     1
## 162  2 307 1720 38.01     1
## 163  2 307 1730 37.91     1
## 164  2 307 1740 37.96     1
## 165  2 307 1750 38.03     1
## 166  2 307 1800 38.17     1
## 167  2 307 1810 38.19     1
## 168  2 307 1820 38.18     1
## 169  2 307 1830 38.15     1
## 170  2 307 1840 38.04     1
## 171  2 307 1850 37.96     1
## 172  2 307 1900 37.84     1
## 173  2 307 1910 37.83     1
## 174  2 307 1920 37.84     1
## 175  2 307 1930 37.74     1
## 176  2 307 1940 37.76     1
## 177  2 307 1950 37.76     1
## 178  2 307 2000 37.64     1
## 179  2 307 2010 37.63     1
## 180  2 307 2020 38.06     1
## 181  2 307 2030 38.19     1
## 182  2 307 2040 38.35     1
## 183  2 307 2050 38.25     1
## 184  2 307 2100 37.86     1
## 185  2 307 2110 37.95     1
## 186  2 307 2120 37.95     1
## 187  2 307 2130 37.76     1
## 188  2 307 2140 37.60     1
## 189  2 307 2150 37.89     1
## 190  2 307 2200 37.86     1
## 191  2 307 2210 37.71     1
## 192  2 307 2220 37.78     1
## 193  2 307 2230 37.82     1
## 194  2 307 2240 37.76     1
## 195  2 307 2250 37.81     1
## 196  2 307 2300 37.84     1
## 197  2 307 2310 38.01     1
## 198  2 307 2320 38.10     1
## 199  2 307 2330 38.15     1
## 200  2 307 2340 37.92     1
## 201  2 307 2350 37.64     1
## 202  2 308    0 37.70     1
## 203  2 308   10 37.46     1
## 204  2 308   20 37.41     1
## 205  2 308   30 37.46     1
## 206  2 308   40 37.56     1
## 207  2 308   50 37.55     1
## 208  2 308  100 37.75     1
## 209  2 308  110 37.76     1
## 210  2 308  120 37.73     1
## 211  2 308  130 37.77     1
## 212  2 308  140 38.01     1
## 213  2 308  150 38.04     1
## 214  2 308  200 38.07     1

07. 표준 패키지에 포함되어 있는 VADeaths 데이터셋에 대해 다음 작업을 수행하시오.

  1. VADeaths 데이터셋의 자료형을 확인하고 만일 데이터프레임이 아니면 데이터프레임으로 변환하시오.
  2. 행 이름을 이용하여 Age변수를 추가하고 기존의 행이름을 삭제하시오.
  3. 네 개 사망률 변수에 대한 평균을 계산하여 Average변수에 추가하시오.
  4. Age 변수와 Average 변수가 첫번째, 두번째 열에 위치하도록 열의 순서를 조정하시오.
# (a) VADeaths 데이터셋의 자료형을 확인하고 만일 데이터프레임이 아니면 데이터프레임으로 변환하시오.
class(VADeaths)
## [1] "matrix"
VADeaths <- as.data.frame(VADeaths)
class(VADeaths)
## [1] "data.frame"
# (b) 행 이름을 이용하여 Age변수를 추가하고 기존의 행이름을 삭제하시오.
VADeaths$Age <- rownames(VADeaths)
rownames(VADeaths) <- NULL
VADeaths
##   Rural Male Rural Female Urban Male Urban Female   Age
## 1       11.7          8.7       15.4          8.4 50-54
## 2       18.1         11.7       24.3         13.6 55-59
## 3       26.9         20.3       37.0         19.3 60-64
## 4       41.0         30.9       54.6         35.1 65-69
## 5       66.0         54.3       71.1         50.0 70-74
# (c) 네 개 사망률 변수에 대한 평균을 계산하여 Average변수에 추가하시오.  
VADeaths$Average <- rowMeans(VADeaths[,1:4])
VADeaths
##   Rural Male Rural Female Urban Male Urban Female   Age Average
## 1       11.7          8.7       15.4          8.4 50-54  11.050
## 2       18.1         11.7       24.3         13.6 55-59  16.925
## 3       26.9         20.3       37.0         19.3 60-64  25.875
## 4       41.0         30.9       54.6         35.1 65-69  40.400
## 5       66.0         54.3       71.1         50.0 70-74  60.350
# (d) Age 변수와 Average 변수가 첫번째, 두번째 열에 위치하도록 열의 순서를 조정하시오.
VADeaths <- VADeaths[,c(5,6,1:4)]
VADeaths
##     Age Average Rural Male Rural Female Urban Male Urban Female
## 1 50-54  11.050       11.7          8.7       15.4          8.4
## 2 55-59  16.925       18.1         11.7       24.3         13.6
## 3 60-64  25.875       26.9         20.3       37.0         19.3
## 4 65-69  40.400       41.0         30.9       54.6         35.1
## 5 70-74  60.350       66.0         54.3       71.1         50.0

08. 표준패키지에 포함되어 있는 USArrests데이터셋에 대해 다음 작업을 수행하시오.

  1. USArrests 데이터셋의 데이터 구조를 확인하고, 다섯 행 간격으로 데이터를 화면에 출력하시오(1번행 , 6번행, 11번행,…).
  2. 10만명당 살인사건 발생건수가 15를 초과하는 주는 몇 개인지 구하시오.
  3. 10만명당 살인사건 발생건수가 평균을 초과하는 주의 명단을 제시하시오.
  4. 10만명당 살인사건 발생건수가 가장 큰 주와 가장 작은 주의 이름을 제시하시오. 이 때, which.max()와 which.min()함수의 사용법을 검색하여 확인후 사용하시오.
# (a) USArrests 데이터셋의 데이터 구조를 확인하고, 다섯 행 간격으로 데이터를 화면에 출력하시오(1번행 , 6번행, 11번행,...).  
str(USArrests)
## 'data.frame':    50 obs. of  4 variables:
##  $ Murder  : num  13.2 10 8.1 8.8 9 7.9 3.3 5.9 15.4 17.4 ...
##  $ Assault : int  236 263 294 190 276 204 110 238 335 211 ...
##  $ UrbanPop: int  58 48 80 50 91 78 77 72 80 60 ...
##  $ Rape    : num  21.2 44.5 31 19.5 40.6 38.7 11.1 15.8 31.9 25.8 ...
USArrests[seq(1,nrow(USArrests),5),]
##               Murder Assault UrbanPop Rape
## Alabama         13.2     236       58 21.2
## Colorado         7.9     204       78 38.7
## Hawaii           5.3      46       83 20.2
## Kansas           6.0     115       66 18.0
## Massachusetts    4.4     149       85 16.3
## Montana          6.0     109       53 16.4
## New Mexico      11.4     285       70 32.1
## Oklahoma         6.6     151       68 20.0
## South Dakota     3.8      86       45 12.8
## Virginia         8.5     156       63 20.7
# (b) 10만명당 살인사건 발생건수가 15를 초과하는 주는 몇 개인지 구하시오.  
nrow(subset(USArrests, USArrests$Murder>15))
## [1] 4
# (c) 10만명당 살인사건 발생건수가 평균을 초과하는 주의 명단을 제시하시오.    
rownames(subset(USArrests, USArrests$Murder>mean(USArrests$Murder)))
##  [1] "Alabama"        "Alaska"         "Arizona"        "Arkansas"      
##  [5] "California"     "Colorado"       "Florida"        "Georgia"       
##  [9] "Illinois"       "Kentucky"       "Louisiana"      "Maryland"      
## [13] "Michigan"       "Mississippi"    "Missouri"       "Nevada"        
## [17] "New Mexico"     "New York"       "North Carolina" "South Carolina"
## [21] "Tennessee"      "Texas"          "Virginia"
# (d) 10만명당 살인사건 발생건수가 가장 큰 주와 가장 작은 주의 이름을 제시하시오. 이 때, which.max()와 which.min()함수의 사용법을 검색하여 확인후 사용하시오. 
row.names(USArrests[which.max(USArrests$Murder),])
## [1] "Georgia"
row.names(USArrests)[which.min(USArrests$Murder)]
## [1] "North Dakota"

09. MASS 패키지에 포함된 mammals 데이터셋에 대해 다음 작업을 수행하시오.

  1. mammals 데이터셋의 데이터 구조를 확인하고, size열을 추가하여 몸무게가 중위수보다 큰 동물에는 large를, 작은 동물에게는 small을 저장하시오. 이 때 조건문을 위해 ifelse()를 사용법 확인후 사용하시오.
library(MASS)
str(mammals)
## 'data.frame':    62 obs. of  2 variables:
##  $ body : num  3.38 0.48 1.35 465 36.33 ...
##  $ brain: num  44.5 15.5 8.1 423 119.5 ...
mammals$size <- ifelse(mammals$body>median(mammals$body),"large","small")
head(mammals)
##                    body brain  size
## Arctic fox        3.385  44.5 large
## Owl monkey        0.480  15.5 small
## Mountain beaver   1.350   8.1 small
## Cow             465.000 423.0 large
## Grey wolf        36.330 119.5 large
## Goat             27.660 115.0 large
  1. size가 large인 동물을 추출하시오.
mammals[mammals$size=="large",] # subset(mammals,size=="large")
##                           body  brain  size
## Arctic fox               3.385   44.5 large
## Cow                    465.000  423.0 large
## Grey wolf               36.330  119.5 large
## Goat                    27.660  115.0 large
## Roe deer                14.830   98.2 large
## Verbet                   4.190   58.0 large
## Nine-banded armadillo    3.500   10.8 large
## Asian elephant        2547.000 4603.0 large
## Donkey                 187.100  419.0 large
## Horse                  521.000  655.0 large
## Patas monkey            10.000  115.0 large
## Giraffe                529.000  680.0 large
## Gorilla                207.000  406.0 large
## Grey seal               85.000  325.0 large
## Human                   62.000 1320.0 large
## African elephant      6654.000 5712.0 large
## Water opossum            3.500    3.9 large
## Rhesus monkey            6.800  179.0 large
## Kangaroo                35.000   56.0 large
## Yellow-bellied marmot    4.050   17.0 large
## Okapi                  250.000  490.0 large
## Sheep                   55.500  175.0 large
## Jaguar                 100.000  157.0 large
## Chimpanzee              52.160  440.0 large
## Baboon                  10.550  179.5 large
## Giant armadillo         60.000   81.0 large
## Rock hyrax-b             3.600   21.0 large
## Raccoon                  4.288   39.2 large
## Pig                    192.000  180.0 large
## Brazilian tapir        160.000  169.0 large
## Red fox                  4.235   50.4 large
  1. 몸무게가 가장 큰 동물과 가장 작은 동물을 추출하시오. 이 때 which.max()와 which.min()함수 사용법을 확인후 활용하시오.
mammals[which.max(mammals$body),]
##                  body brain  size
## African elephant 6654  5712 large
row.names(mammals[which.min(mammals$body),])
## [1] "Lesser short-tailed shrew"
  1. 두뇌무게(단위: g) 대 몸무게(단위 : kg)의 비율을 퍼센트로 환산하여 brain.percent열에 추가하고, 이 비율이 가장 큰 동물과 가장 작은 동물을 추출하시오(which.max()와 which.min()함수 사용법을 확인후 활용).
mammals$brain.percent <- (mammals$brain/mammals$body)
head(mammals)
##                    body brain  size brain.percent
## Arctic fox        3.385  44.5 large    13.1462334
## Owl monkey        0.480  15.5 small    32.2916667
## Mountain beaver   1.350   8.1 small     6.0000000
## Cow             465.000 423.0 large     0.9096774
## Grey wolf        36.330 119.5 large     3.2892926
## Goat             27.660 115.0 large     4.1576283
mammals[which.max(mammals$brain.percent),]
##                  body brain  size brain.percent
## Ground squirrel 0.101     4 small      39.60396
mammals[which.min(mammals$brain.percent),]
##                  body brain  size brain.percent
## African elephant 6654  5712 large      0.858431
  1. 두뇌무게 대 몸무게의 비율이 중위수보다 크면서 크기가 large인 동물을 추출하시오.
subset(mammals, brain.percent>median(brain.percent) & size=="large")
##                 body  brain  size brain.percent
## Arctic fox     3.385   44.5 large     13.146233
## Roe deer      14.830   98.2 large      6.621713
## Verbet         4.190   58.0 large     13.842482
## Patas monkey  10.000  115.0 large     11.500000
## Human         62.000 1320.0 large     21.290323
## Rhesus monkey  6.800  179.0 large     26.323529
## Chimpanzee    52.160  440.0 large      8.435583
## Baboon        10.550  179.5 large     17.014218
## Raccoon        4.288   39.2 large      9.141791
## Red fox        4.235   50.4 large     11.900826

탐색적 분석을 위해 EDAR by example을 참조하여 다음을 수행한다.

  1. plot(mammals$body, mammals$brain)을 수행하여 나타난 그림을 확인 후 문제점이 무엇인지 설명하시오.
# 두 변수의 단위가 너무 커서 x와 y의 변화관계가 그림에 잘 드러나지 않는다. 즉 값들이 왼쪽 아래에 몰려 있어 관계를 파악하기 어렵다.
plot(mammals$body, mammals$brain)

  1. plot(log(mammals$body), log(mammals$brain), xlab="log(body)", ylab = "log(brain)")을 수행하고 (f)와 비교하시오
## 로그변환(log-log 모델)을 통해 x와 y의 변화관계를 절대량이 아닌 비율(x의 미세한 %변화율에 대한 y의 %변화율)로 표현해서 변화관계를 파악하기에 좋다. 
plot(log(mammals$body), log(mammals$brain), xlab="log(body)", ylab = "log(brain)")