2. 전처리 2
2.1 행/열의 계산 - apply 계열 함수
- 입력된 데이터 전체에 같은 계산을 수행하게 하는 함수로 apply 계열의 함수가 있다. 이들은 벡터 연산을 수행하므로 결과를 빠르게 도출한다.
2.1.1 apply()
- 행 또는 열 방향으로 계산한다.
- 열 방향 계산을 수행했고, 결과는 열방향으로 저정되었다.
- 입력데이터는 행렬이고 결과는 벡터로 출력
1.기본법 사용법
m <- matrix(1:9, ncol = 3); m## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
apply(m, 2, sqrt) # 특별한 이유가 없으면 2를 입력한다.## [,1] [,2] [,3]
## [1,] 1.000000 2.000000 2.645751
## [2,] 1.414214 2.236068 2.828427
## [3,] 1.732051 2.449490 3.000000
- 행 방향 계산을 수행하여도 결과는 열 방향으로 저장된다.
m <- matrix(1:9, ncol = 3); m## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
apply(m, 1, sqrt) ## [,1] [,2] [,3]
## [1,] 1.000000 1.414214 1.732051
## [2,] 2.000000 2.236068 2.449490
## [3,] 2.645751 2.828427 3.000000
- apply 함수와 사용자 정의 함수의 결합
- function 함수
say <- function() {
print("당신이 입력한 문장은 아래와 같습니다")
print(s)
}
final.score <- function(name, current.score) {
print(name)
print(past("your final score :", current.score +2))
}- if 문
a <- 3
if(a == 3) {
print("3입니다")
}## [1] "3입니다"
if(a == 3) {
print("3입니다")
} else {
print(a)
}## [1] "3입니다"
a <- 4
if(a == 3){
print("3입니다")
}else if (a == 2) {
print("2입니다")
}else {
print(a)
}## [1] 4
- for문
for(i in 1:10) {
print(i)
}## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
x <- c(1:10)
for(i in x) {
print(i)
}## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
for(i in i:length(x)) {
print(x)
}## [1] 1 2 3 4 5 6 7 8 9 10
- 사용자 정의 함수와의 연계 -아규먼트 1개 있는 경우
m <- matrix(1:9, ncol = 3); m## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
my.func1 <- function(m) {
m^2-2*m+3
}
apply(m, 2, my.func1) #열 방향## [,1] [,2] [,3]
## [1,] 2 11 38
## [2,] 3 18 51
## [3,] 6 27 66
apply(m, 1, my.func1) #행 방향## [,1] [,2] [,3]
## [1,] 2 3 6
## [2,] 11 18 27
## [3,] 38 51 66
- 아규먼트가 2개 있는 경우
my.func2 <- function(m, arg) {
m+arg
}
apply(m, 2, my.func2, 4) # 열 방향## [,1] [,2] [,3]
## [1,] 5 8 11
## [2,] 6 9 12
## [3,] 7 10 13
apply(m, 1, my.func2, 4) # 행 방향## [,1] [,2] [,3]
## [1,] 5 6 7
## [2,] 8 9 10
## [3,] 11 12 13
- 아규먼트가 3개 있는 경우
my.func3 <- function(m, arg1, arg2) {
m + arg1 + arg2
}
apply(m, 2, my.func3, 2, 3) # 열 방향## [,1] [,2] [,3]
## [1,] 6 9 12
## [2,] 7 10 13
## [3,] 8 11 14
apply(m, 1, my.func3, 2, 3) # 행 방향## [,1] [,2] [,3]
## [1,] 6 7 8
## [2,] 9 10 11
## [3,] 12 13 14
- 기초 통계 함수와의 연계
apply(m, 2, sum)## [1] 6 15 24
apply(m, 1, sum)## [1] 12 15 18
- 행과 열의 합과 평균 계산은 이에 특화된 함수들이 별도로 존재한다
- rowSums(), rowMeans(), colSums(), colMeans() 등의 colSums 계열 함수
apply(iris[,1:4], 2, sum) # 아이리스 데이터 열 방향 ## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 876.5 458.6 563.7 179.9
colSums(iris[, 1:4])## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 876.5 458.6 563.7 179.9
colMeans(iris[, 1:4])## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 5.843333 3.057333 3.758000 1.199333
2.1.2 lapply()
- 데이터의 각 요소에 특정 함수를 적용
- 입력 데이터 : 벡터, 데이터 프레임
- 결과 데이터 : 리스트
- 기본 사용법
l <- lapply(iris[, 1:4], mean); l## $Sepal.Length
## [1] 5.843333
##
## $Sepal.Width
## [1] 3.057333
##
## $Petal.Length
## [1] 3.758
##
## $Petal.Width
## [1] 1.199333
v <- unlist(l); l # 리스트를 벡터로 변환## $Sepal.Length
## [1] 5.843333
##
## $Sepal.Width
## [1] 3.057333
##
## $Petal.Length
## [1] 3.758
##
## $Petal.Width
## [1] 1.199333
class(v)## [1] "numeric"
m <- matrix(v, ncol = 4);m # 처음 구조처럼 4개 컬럼자리 행렬로 변환## [,1] [,2] [,3] [,4]
## [1,] 5.843333 3.057333 3.758 1.199333
d <- as.data.frame(m);d # 행렬을 데이터 프레임으로 변환## V1 V2 V3 V4
## 1 5.843333 3.057333 3.758 1.199333
names(d) <- names(iris[, 1:4]); d # 원 데이터 프레임의 이름으로 결과에 이름 부여## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 5.843333 3.057333 3.758 1.199333
lapply 연습
- sum은 단일값이 sqrt은 복수값이 나온다
head(lapply(iris[, 1:2], sqrt))
lapply(iris[, 1:2], sum)m=matrix(1:9,ncol=3)
df=as.data.frame(m)
df## V1 V2 V3
## 1 1 4 7
## 2 2 5 8
## 3 3 6 9
l1=lapply(df,my.func1)
l2=lapply(df,my.func2,1)
l3=lapply(df,my.func3,2,1)
v1=unlist(l1)
v2=unlist(l2)
v3=unlist(l3)
v1[v1==5]## named numeric(0)
v2[v2==5]## V21
## 5
x <- c(1,2,3,4,5)
for(i in x) {
if (i == 5) {
print(i)
} else if (i != 5){
print(".")
}
}## [1] "."
## [1] "."
## [1] "."
## [1] "."
## [1] 5
v3[v3==5] ## V12
## 5
2.1.3 sapply()
- 입력데이터의 각 요소마다 계산한다
- 입력 데이터 : 벡터, 데이터프레임, 리스트
- 결과 데이터 : 벡터, 행렬
- 데이터 프레임의 경우에는 열 뱡향으로만 계산한다.
x <- 1:3
sapply(x, sqrt)## [1] 1.000000 1.414214 1.732051
sapply(iris[, 1:2], sum)## Sepal.Length Sepal.Width
## 876.5 458.6
v <- sapply(iris[, 1:4], mean)
v## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 5.843333 3.057333 3.758000 1.199333
d <- as.data.frame(v); d## v
## Sepal.Length 5.843333
## Sepal.Width 3.057333
## Petal.Length 3.758000
## Petal.Width 1.199333
d <- t(d);d # 행과 열을 바꾸는 함수 ## Sepal.Length Sepal.Width Petal.Length Petal.Width
## v 5.843333 3.057333 3.758 1.199333
- 행렬로 출력되는 경우
m <- sapply(iris[, 1:2], sqrt) #각각의 모든 요소에 대하여 sqrt 계산
class(m)## [1] "matrix"
2.1.4 tapply()
- 입력데이터에 대하여 기준 컬럼 별로 계산한다.
- 입력 데이터 : 벡터
- 결과 데이터 : 배열
id <- c(1, 2, 3)
gender <- c("F", "F", "M")
height <- c(160, 165, 170)
df <- data.frame(id, gender, height);df## id gender height
## 1 1 F 160
## 2 2 F 165
## 3 3 M 170
tapply(df$height, df$gender, sum) # gender를 기준으로 삼고 height의 합을 계산## F M
## 325 170
tapply(df$height, df$gender, sqrt)## $F
## [1] 12.64911 12.84523
##
## $M
## [1] 13.0384
연습문제
- mtcars 데이터의 변수별 평균을 구하시오.
mtcars## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
apply(mtcars, 2, mean)## mpg cyl disp hp drat wt
## 20.090625 6.187500 230.721875 146.687500 3.596563 3.217250
## qsec vs am gear carb
## 17.848750 0.437500 0.406250 3.687500 2.812500
mtcars.1 <- apply(mtcars, 1, mean)[8:14]
mtcars.1## Merc 240D Merc 230 Merc 280 Merc 280C Merc 450SE Merc 450SL
## 24.63455 27.23364 31.86000 31.78727 46.43091 46.50000
## Merc 450SLC
## 46.35000
- merc~ 차종의 변수별 평균을 구하시오.
apply(mtcars,1,mean)[8:14]## Merc 240D Merc 230 Merc 280 Merc 280C Merc 450SE Merc 450SL
## 24.63455 27.23364 31.86000 31.78727 46.43091 46.50000
## Merc 450SLC
## 46.35000
- 차종별 모든 행의 합을 구하시오.
rowSums(mtcars)## Mazda RX4 Mazda RX4 Wag Datsun 710
## 328.980 329.795 259.580
## Hornet 4 Drive Hornet Sportabout Valiant
## 426.135 590.310 385.540
## Duster 360 Merc 240D Merc 230
## 656.920 270.980 299.570
## Merc 280 Merc 280C Merc 450SE
## 350.460 349.660 510.740
## Merc 450SL Merc 450SLC Cadillac Fleetwood
## 511.500 509.850 728.560
## Lincoln Continental Chrysler Imperial Fiat 128
## 726.644 725.695 213.850
## Honda Civic Toyota Corolla Toyota Corona
## 195.165 206.955 273.775
## Dodge Challenger AMC Javelin Camaro Z28
## 519.650 506.085 646.280
## Pontiac Firebird Fiat X1-9 Porsche 914-2
## 631.175 208.215 272.570
## Lotus Europa Ford Pantera L Ferrari Dino
## 273.683 670.690 379.590
## Maserati Bora Volvo 142E
## 694.710 288.890
4.1 lappy()를 이용해 벡터로 변환하시오.
mtcars.l <- lapply(mtcars, sum); mtcars.l## $mpg
## [1] 642.9
##
## $cyl
## [1] 198
##
## $disp
## [1] 7383.1
##
## $hp
## [1] 4694
##
## $drat
## [1] 115.09
##
## $wt
## [1] 102.952
##
## $qsec
## [1] 571.16
##
## $vs
## [1] 14
##
## $am
## [1] 13
##
## $gear
## [1] 118
##
## $carb
## [1] 90
unlist(mtcars.1)## Merc 240D Merc 230 Merc 280 Merc 280C Merc 450SE Merc 450SL
## 24.63455 27.23364 31.86000 31.78727 46.43091 46.50000
## Merc 450SLC
## 46.35000
4.2 sapply()를 이용해 컬럼 별 합을 구하시오.
mtcasr.s <- sapply(mtcars, sum)5.1 vs가 0 인 모델과 vs가 1인 모델의 hp 의 평균 차이는
mean <- tapply(mtcars$hp, mtcars$vs, mean)
mean[1] - mean[2]## 0
## 98.36508
5.2 기어에 따른 각 모델의 마력
tapply(mtcars$hp, mtcars$gear, mean)## 3 4 5
## 176.1333 89.5000 195.6000
2.2 행 병합
2.2.1 행 병합의 필요성
- 행 합치기는 주로 다음의 두 경우에 사용된다.
- 여러 계산 결과를 하나로 묶어야 할 때
- 기존 데이터에 행을 추가해야 할 때 ### 2.2.2 rbind()
- 같은 종류의 원소로 구성되어 있을 때
x <- c(1, 2, 3, 4, 5)
y <- c(10, 20, 30, 40, 50)
d <- data.frame(x, y); d## x y
## 1 1 10
## 2 2 20
## 3 3 30
## 4 4 40
## 5 5 50
rbind(d, c(6, 60))## x y
## 1 1 10
## 2 2 20
## 3 3 30
## 4 4 40
## 5 5 50
## 6 6 60
- 다른 종류의 원소로 구성되어 있을 때
- 백터로 만들어서 넣으면, 백터는 한가지 속성밖에 못받기 때문에 전부 캐릭터로 바뀌는 것을 알 수 있다.
d <- rbind(iris, c(1, 2, 3, 4, "setos")) ## Warning in `[<-.factor`(`*tmp*`, ri, value = "setos"): invalid factor
## level, NA generated
str(d)## 'data.frame': 151 obs. of 5 variables:
## $ Sepal.Length: chr "5.1" "4.9" "4.7" "4.6" ...
## $ Sepal.Width : chr "3.5" "3" "3.2" "3.1" ...
## $ Petal.Length: chr "1.4" "1.4" "1.3" "1.5" ...
## $ Petal.Width : chr "0.2" "0.2" "0.2" "0.2" ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
- 다른 종류의 원소가 들어가게 하려면 먼저 데이터 프레임으로 만든다.
d1 <- data.frame(Sepal.Length = 1, Sepal.Width = 2, Petal.Length = 3, Petal.Width = 4, Species = "setosa")
d2 <- rbind(iris, d1)
d2## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 9 4.4 2.9 1.4 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## 11 5.4 3.7 1.5 0.2 setosa
## 12 4.8 3.4 1.6 0.2 setosa
## 13 4.8 3.0 1.4 0.1 setosa
## 14 4.3 3.0 1.1 0.1 setosa
## 15 5.8 4.0 1.2 0.2 setosa
## 16 5.7 4.4 1.5 0.4 setosa
## 17 5.4 3.9 1.3 0.4 setosa
## 18 5.1 3.5 1.4 0.3 setosa
## 19 5.7 3.8 1.7 0.3 setosa
## 20 5.1 3.8 1.5 0.3 setosa
## 21 5.4 3.4 1.7 0.2 setosa
## 22 5.1 3.7 1.5 0.4 setosa
## 23 4.6 3.6 1.0 0.2 setosa
## 24 5.1 3.3 1.7 0.5 setosa
## 25 4.8 3.4 1.9 0.2 setosa
## 26 5.0 3.0 1.6 0.2 setosa
## 27 5.0 3.4 1.6 0.4 setosa
## 28 5.2 3.5 1.5 0.2 setosa
## 29 5.2 3.4 1.4 0.2 setosa
## 30 4.7 3.2 1.6 0.2 setosa
## 31 4.8 3.1 1.6 0.2 setosa
## 32 5.4 3.4 1.5 0.4 setosa
## 33 5.2 4.1 1.5 0.1 setosa
## 34 5.5 4.2 1.4 0.2 setosa
## 35 4.9 3.1 1.5 0.2 setosa
## 36 5.0 3.2 1.2 0.2 setosa
## 37 5.5 3.5 1.3 0.2 setosa
## 38 4.9 3.6 1.4 0.1 setosa
## 39 4.4 3.0 1.3 0.2 setosa
## 40 5.1 3.4 1.5 0.2 setosa
## 41 5.0 3.5 1.3 0.3 setosa
## 42 4.5 2.3 1.3 0.3 setosa
## 43 4.4 3.2 1.3 0.2 setosa
## 44 5.0 3.5 1.6 0.6 setosa
## 45 5.1 3.8 1.9 0.4 setosa
## 46 4.8 3.0 1.4 0.3 setosa
## 47 5.1 3.8 1.6 0.2 setosa
## 48 4.6 3.2 1.4 0.2 setosa
## 49 5.3 3.7 1.5 0.2 setosa
## 50 5.0 3.3 1.4 0.2 setosa
## 51 7.0 3.2 4.7 1.4 versicolor
## 52 6.4 3.2 4.5 1.5 versicolor
## 53 6.9 3.1 4.9 1.5 versicolor
## 54 5.5 2.3 4.0 1.3 versicolor
## 55 6.5 2.8 4.6 1.5 versicolor
## 56 5.7 2.8 4.5 1.3 versicolor
## 57 6.3 3.3 4.7 1.6 versicolor
## 58 4.9 2.4 3.3 1.0 versicolor
## 59 6.6 2.9 4.6 1.3 versicolor
## 60 5.2 2.7 3.9 1.4 versicolor
## 61 5.0 2.0 3.5 1.0 versicolor
## 62 5.9 3.0 4.2 1.5 versicolor
## 63 6.0 2.2 4.0 1.0 versicolor
## 64 6.1 2.9 4.7 1.4 versicolor
## 65 5.6 2.9 3.6 1.3 versicolor
## 66 6.7 3.1 4.4 1.4 versicolor
## 67 5.6 3.0 4.5 1.5 versicolor
## 68 5.8 2.7 4.1 1.0 versicolor
## 69 6.2 2.2 4.5 1.5 versicolor
## 70 5.6 2.5 3.9 1.1 versicolor
## 71 5.9 3.2 4.8 1.8 versicolor
## 72 6.1 2.8 4.0 1.3 versicolor
## 73 6.3 2.5 4.9 1.5 versicolor
## 74 6.1 2.8 4.7 1.2 versicolor
## 75 6.4 2.9 4.3 1.3 versicolor
## 76 6.6 3.0 4.4 1.4 versicolor
## 77 6.8 2.8 4.8 1.4 versicolor
## 78 6.7 3.0 5.0 1.7 versicolor
## 79 6.0 2.9 4.5 1.5 versicolor
## 80 5.7 2.6 3.5 1.0 versicolor
## 81 5.5 2.4 3.8 1.1 versicolor
## 82 5.5 2.4 3.7 1.0 versicolor
## 83 5.8 2.7 3.9 1.2 versicolor
## 84 6.0 2.7 5.1 1.6 versicolor
## 85 5.4 3.0 4.5 1.5 versicolor
## 86 6.0 3.4 4.5 1.6 versicolor
## 87 6.7 3.1 4.7 1.5 versicolor
## 88 6.3 2.3 4.4 1.3 versicolor
## 89 5.6 3.0 4.1 1.3 versicolor
## 90 5.5 2.5 4.0 1.3 versicolor
## 91 5.5 2.6 4.4 1.2 versicolor
## 92 6.1 3.0 4.6 1.4 versicolor
## 93 5.8 2.6 4.0 1.2 versicolor
## 94 5.0 2.3 3.3 1.0 versicolor
## 95 5.6 2.7 4.2 1.3 versicolor
## 96 5.7 3.0 4.2 1.2 versicolor
## 97 5.7 2.9 4.2 1.3 versicolor
## 98 6.2 2.9 4.3 1.3 versicolor
## 99 5.1 2.5 3.0 1.1 versicolor
## 100 5.7 2.8 4.1 1.3 versicolor
## 101 6.3 3.3 6.0 2.5 virginica
## 102 5.8 2.7 5.1 1.9 virginica
## 103 7.1 3.0 5.9 2.1 virginica
## 104 6.3 2.9 5.6 1.8 virginica
## 105 6.5 3.0 5.8 2.2 virginica
## 106 7.6 3.0 6.6 2.1 virginica
## 107 4.9 2.5 4.5 1.7 virginica
## 108 7.3 2.9 6.3 1.8 virginica
## 109 6.7 2.5 5.8 1.8 virginica
## 110 7.2 3.6 6.1 2.5 virginica
## 111 6.5 3.2 5.1 2.0 virginica
## 112 6.4 2.7 5.3 1.9 virginica
## 113 6.8 3.0 5.5 2.1 virginica
## 114 5.7 2.5 5.0 2.0 virginica
## 115 5.8 2.8 5.1 2.4 virginica
## 116 6.4 3.2 5.3 2.3 virginica
## 117 6.5 3.0 5.5 1.8 virginica
## 118 7.7 3.8 6.7 2.2 virginica
## 119 7.7 2.6 6.9 2.3 virginica
## 120 6.0 2.2 5.0 1.5 virginica
## 121 6.9 3.2 5.7 2.3 virginica
## 122 5.6 2.8 4.9 2.0 virginica
## 123 7.7 2.8 6.7 2.0 virginica
## 124 6.3 2.7 4.9 1.8 virginica
## 125 6.7 3.3 5.7 2.1 virginica
## 126 7.2 3.2 6.0 1.8 virginica
## 127 6.2 2.8 4.8 1.8 virginica
## 128 6.1 3.0 4.9 1.8 virginica
## 129 6.4 2.8 5.6 2.1 virginica
## 130 7.2 3.0 5.8 1.6 virginica
## 131 7.4 2.8 6.1 1.9 virginica
## 132 7.9 3.8 6.4 2.0 virginica
## 133 6.4 2.8 5.6 2.2 virginica
## 134 6.3 2.8 5.1 1.5 virginica
## 135 6.1 2.6 5.6 1.4 virginica
## 136 7.7 3.0 6.1 2.3 virginica
## 137 6.3 3.4 5.6 2.4 virginica
## 138 6.4 3.1 5.5 1.8 virginica
## 139 6.0 3.0 4.8 1.8 virginica
## 140 6.9 3.1 5.4 2.1 virginica
## 141 6.7 3.1 5.6 2.4 virginica
## 142 6.9 3.1 5.1 2.3 virginica
## 143 5.8 2.7 5.1 1.9 virginica
## 144 6.8 3.2 5.9 2.3 virginica
## 145 6.7 3.3 5.7 2.5 virginica
## 146 6.7 3.0 5.2 2.3 virginica
## 147 6.3 2.5 5.0 1.9 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3.0 5.1 1.8 virginica
## 151 1.0 2.0 3.0 4.0 setosa
2.3 열 병합
2.3.1 열 병합의 필요성
- 데이터의 양이 크고, 구조가 복잡할 수록 처리하기는 어렵기 때문에 작업의 효율을 위하여 필요한 컬럼만 모아서 새로운 데이터를 만들 필요가 있다.
2.3.2 cbind()
- cbind()는 기본적으로 행렬을 만든다
- 데이터프레임 구조를 유지하기 위해서는 먼저 데이터 프레임을 만들어야 한다.
iris.Sepal.lw <- cbind(iris$Sepal.Length, iris$Sepal.Width)
head(iris.Sepal.lw) # matrix## [,1] [,2]
## [1,] 5.1 3.5
## [2,] 4.9 3.0
## [3,] 4.7 3.2
## [4,] 4.6 3.1
## [5,] 5.0 3.6
## [6,] 5.4 3.9
x <- c(1, 2, 3, 4 ,5)
y <- c(10, 20, 30, 40, 50)
z <- c("M", "M", "M", "F", "F")
d <- data.frame(x)
d <- cbind(d, y, z, stringsAsFactor = FALSE)2.3.3 $연산자를 이용한 병합
x <- c(1, 2, 3, 4 ,5)
y <- c(10, 20, 30, 40, 50)
z <- c("M", "M", "M", "F", "F")
d <- data.frame(x)
d$y <- y
d$z <- z연습문제
iris.S.L <- iris$Sepal.Length
iris.S.W <- iris$Sepal.Width
S <- iris$Species
d <- data.frame(x)
d <- cbind(iris.S.L, iris.S.W, S)2.3.4 merge()를 이용한 병합
- merge()는 공통 컬럼을 기준으로 통합한다.
name <- c("Jamse", "Mary", "John")
math <- c(70, 80, 90)
d1 <- data.frame(name, math)
name <- c("Jamse", "Mary", "John")
english <- c(80, 70, 90)
d2 <- data.frame(name, english)
merge(d1, d2)## name math english
## 1 Jamse 70 80
## 2 John 90 90
## 3 Mary 80 70
2.3.5 merge()와 cbind() 비교
merge(d1, d2); cbind(d1, d2)## name math english
## 1 Jamse 70 80
## 2 John 90 90
## 3 Mary 80 70
## name math name english
## 1 Jamse 70 Jamse 80
## 2 Mary 80 Mary 70
## 3 John 90 John 90
2.3.6 by 옵션을 사용한 merge()
- 공통 컬럼은 가급적 하나인 것이 좋다. 단, by = 옵션을 사용할 수 있다.
name <- c("Jamse", "Mary", "John")
age <- c(72, 73, 74)
math <- c(70, 80, 90)
d1 <- data.frame(name, age, math)
name <- c("Jamse", "Mary", "John")
english <- c(80, 70, 90)
age <- c(72, 74, 73)
d2 <- data.frame(name, age, english)
merge(d1, d2, by = "name")## name age.x math age.y english
## 1 Jamse 72 70 72 80
## 2 John 74 90 73 90
## 3 Mary 73 80 74 70
2.3.7 all = FALSE를 사용한 merge()
- 공통 컬럼에 공통값이 없으면 해당 행은 제외된다.
- 기본값은 all = FALSE 이다
name <- c("James", "Mary", "John", "Lion")
age <- c(72, 73, 74, 89)
math <- c(70, 80, 90, 100)
d1 <- data.frame(name, age, math); d1## name age math
## 1 James 72 70
## 2 Mary 73 80
## 3 John 74 90
## 4 Lion 89 100
name <- c("James", "Mary", "John")
english <- c(80, 70, 90)
year <- c(72, 74, 73)
d2 <- data.frame(name, year, english); d2## name year english
## 1 James 72 80
## 2 Mary 74 70
## 3 John 73 90
merge(d1,d2)## name age math year english
## 1 James 72 70 72 80
## 2 John 74 90 73 90
## 3 Mary 73 80 74 70
merge(d1, d2, all = TRUE) # merge는 경고가 없는 반면, left_join()은 경고를 제시한다.## name age math year english
## 1 James 72 70 72 80
## 2 John 74 90 73 90
## 3 Lion 89 100 NA NA
## 4 Mary 73 80 74 70
연습문제
1 . 데이터셋에서 Pclass, Sex, Age, SibSp, Parch, Fare, Embarked를 추출하여 selected 에 저장하시오
data <- read.csv("train.csv")
selected <- subset(data, select = c(Pclass, Sex, Age, SibSp, Parch, Fare, Embarked))
head(selected)## Pclass Sex Age SibSp Parch Fare Embarked
## 1 3 male 22 1 0 7.2500 S
## 2 1 female 38 1 0 71.2833 C
## 3 3 female 26 0 0 7.9250 S
## 4 1 female 35 1 0 53.1000 S
## 5 3 male 35 0 0 8.0500 S
## 6 3 male NA 0 0 8.4583 Q
- test 데이터에서 1번 문제와 동일한 작업을 수행
test <- read.csv("test.csv")
selected_test <- subset(test, select = c(Pclass, Sex, Age, SibSp, Parch, Fare, Embarked))- 1번과 2번의 결과데이터를 rbind를 활용하여 병합하시오
all.data <- rbind(selected,selected_test)
head(all.data)## Pclass Sex Age SibSp Parch Fare Embarked
## 1 3 male 22 1 0 7.2500 S
## 2 1 female 38 1 0 71.2833 C
## 3 3 female 26 0 0 7.9250 S
## 4 1 female 35 1 0 53.1000 S
## 5 3 male 35 0 0 8.0500 S
## 6 3 male NA 0 0 8.4583 Q
2.4 행과 열의 요약
2.4.1 summary()
- 데이터의 컬럼별 요약(기초통계량)을 제시한다
summary(iris)## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
summary(iris$Sepal.Length)## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.300 5.100 5.800 5.843 6.400 7.900
2.4.2 doBy::summaryBy()
- summary() 가 단순 요약을 하는 데 비해, summaryBy()는 조건부 요약을 할 수 있다.
- ~ 의 오른쪽 부분이 조건을 표현한다
#install.packages("doBy")
library(doBy)
summaryBy(Sepal.Length ~ Species, iris)## Species Sepal.Length.mean
## 1 setosa 5.006
## 2 versicolor 5.936
## 3 virginica 6.588
summaryBy(Sepal.Length + Sepal.Width ~ Species, iris) # 해당 칼럼에 대해여 Species 별로 요약한다.## Species Sepal.Length.mean Sepal.Width.mean
## 1 setosa 5.006 3.428
## 2 versicolor 5.936 2.770
## 3 virginica 6.588 2.974
연습문제
summary(all.data) # 이전 문제에서 합성한 데이터## Pclass Sex Age SibSp
## Min. :1.000 female:466 Min. : 0.17 Min. :0.0000
## 1st Qu.:2.000 male :843 1st Qu.:21.00 1st Qu.:0.0000
## Median :3.000 Median :28.00 Median :0.0000
## Mean :2.295 Mean :29.88 Mean :0.4989
## 3rd Qu.:3.000 3rd Qu.:39.00 3rd Qu.:1.0000
## Max. :3.000 Max. :80.00 Max. :8.0000
## NA's :263
## Parch Fare Embarked
## Min. :0.000 Min. : 0.000 : 2
## 1st Qu.:0.000 1st Qu.: 7.896 C:270
## Median :0.000 Median : 14.454 Q:123
## Mean :0.385 Mean : 33.295 S:914
## 3rd Qu.:0.000 3rd Qu.: 31.275
## Max. :9.000 Max. :512.329
## NA's :1
summary(data) # 원 데이터## PassengerId Survived Pclass
## Min. : 1.0 Min. :0.0000 Min. :1.000
## 1st Qu.:223.5 1st Qu.:0.0000 1st Qu.:2.000
## Median :446.0 Median :0.0000 Median :3.000
## Mean :446.0 Mean :0.3838 Mean :2.309
## 3rd Qu.:668.5 3rd Qu.:1.0000 3rd Qu.:3.000
## Max. :891.0 Max. :1.0000 Max. :3.000
##
## Name Sex Age
## Abbing, Mr. Anthony : 1 female:314 Min. : 0.42
## Abbott, Mr. Rossmore Edward : 1 male :577 1st Qu.:20.12
## Abbott, Mrs. Stanton (Rosa Hunt) : 1 Median :28.00
## Abelson, Mr. Samuel : 1 Mean :29.70
## Abelson, Mrs. Samuel (Hannah Wizosky): 1 3rd Qu.:38.00
## Adahl, Mr. Mauritz Nils Martin : 1 Max. :80.00
## (Other) :885 NA's :177
## SibSp Parch Ticket Fare
## Min. :0.000 Min. :0.0000 1601 : 7 Min. : 0.00
## 1st Qu.:0.000 1st Qu.:0.0000 347082 : 7 1st Qu.: 7.91
## Median :0.000 Median :0.0000 CA. 2343: 7 Median : 14.45
## Mean :0.523 Mean :0.3816 3101295 : 6 Mean : 32.20
## 3rd Qu.:1.000 3rd Qu.:0.0000 347088 : 6 3rd Qu.: 31.00
## Max. :8.000 Max. :6.0000 CA 2144 : 6 Max. :512.33
## (Other) :852
## Cabin Embarked
## :687 : 2
## B96 B98 : 4 C:168
## C23 C25 C27: 4 Q: 77
## G6 : 4 S:644
## C22 C26 : 3
## D : 3
## (Other) :186
2.5 정렬, 컬럼 접근
2.5.1 sort()
- 백터를 정렬한다.
x <- c(1, 30, 22, 27, 51, 38, 45)
sort(x)## [1] 1 22 27 30 38 45 51
sort(iris$Sepal.Length)## [1] 4.3 4.4 4.4 4.4 4.5 4.6 4.6 4.6 4.6 4.7 4.7 4.8 4.8 4.8 4.8 4.8 4.9
## [18] 4.9 4.9 4.9 4.9 4.9 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.1 5.1
## [35] 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.2 5.2 5.2 5.2 5.3 5.4 5.4 5.4 5.4 5.4
## [52] 5.4 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.6 5.6 5.6 5.6 5.6 5.6 5.7 5.7 5.7
## [69] 5.7 5.7 5.7 5.7 5.7 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.9 5.9 5.9 6.0 6.0
## [86] 6.0 6.0 6.0 6.0 6.1 6.1 6.1 6.1 6.1 6.1 6.2 6.2 6.2 6.2 6.3 6.3 6.3
## [103] 6.3 6.3 6.3 6.3 6.3 6.3 6.4 6.4 6.4 6.4 6.4 6.4 6.4 6.5 6.5 6.5 6.5
## [120] 6.5 6.6 6.6 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.8 6.8 6.8 6.9 6.9 6.9
## [137] 6.9 7.0 7.1 7.2 7.2 7.2 7.3 7.4 7.6 7.7 7.7 7.7 7.7 7.9
sort(iris$Sepal.Length, decreasing = TRUE) # 내림차순 정리## [1] 7.9 7.7 7.7 7.7 7.7 7.6 7.4 7.3 7.2 7.2 7.2 7.1 7.0 6.9 6.9 6.9 6.9
## [18] 6.8 6.8 6.8 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.6 6.6 6.5 6.5 6.5 6.5
## [35] 6.5 6.4 6.4 6.4 6.4 6.4 6.4 6.4 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.3
## [52] 6.2 6.2 6.2 6.2 6.1 6.1 6.1 6.1 6.1 6.1 6.0 6.0 6.0 6.0 6.0 6.0 5.9
## [69] 5.9 5.9 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.7 5.7 5.7 5.7 5.7 5.7 5.7 5.7
## [86] 5.6 5.6 5.6 5.6 5.6 5.6 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.4 5.4 5.4 5.4
## [103] 5.4 5.4 5.3 5.2 5.2 5.2 5.2 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.0
## [120] 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 4.9 4.9 4.9 4.9 4.9 4.9 4.8 4.8
## [137] 4.8 4.8 4.8 4.7 4.7 4.6 4.6 4.6 4.6 4.5 4.4 4.4 4.4 4.3
2.5.2 order()
- 벡터를 정렬한 뒤 순서를 반환한다.
iris$Sepal.Length## [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4
## [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5
## [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0
## [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8
## [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4
## [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8
## [103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7
## [120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7
## [137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9
order(iris$Sepal.Length)## [1] 14 9 39 43 42 4 7 23 48 3 30 12 13 25 31 46 2
## [18] 10 35 38 58 107 5 8 26 27 36 41 44 50 61 94 1 18
## [35] 20 22 24 40 45 47 99 28 29 33 60 49 6 11 17 21 32
## [52] 85 34 37 54 81 82 90 91 65 67 70 89 95 122 16 19 56
## [69] 80 96 97 100 114 15 68 83 93 102 115 143 62 71 150 63 79
## [86] 84 86 120 139 64 72 74 92 128 135 69 98 127 149 57 73 88
## [103] 101 104 124 134 137 147 52 75 112 116 129 133 138 55 105 111 117
## [120] 148 59 76 66 78 87 109 125 141 145 146 77 113 144 53 121 140
## [137] 142 51 103 110 126 130 108 131 106 118 119 123 136 132
i <- order(iris$Sepal.Length) # 오름차순의 순서
iris$Sepal.Length[i] # 오름차ㅅ 정렬## [1] 4.3 4.4 4.4 4.4 4.5 4.6 4.6 4.6 4.6 4.7 4.7 4.8 4.8 4.8 4.8 4.8 4.9
## [18] 4.9 4.9 4.9 4.9 4.9 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.1 5.1
## [35] 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.2 5.2 5.2 5.2 5.3 5.4 5.4 5.4 5.4 5.4
## [52] 5.4 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.6 5.6 5.6 5.6 5.6 5.6 5.7 5.7 5.7
## [69] 5.7 5.7 5.7 5.7 5.7 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.9 5.9 5.9 6.0 6.0
## [86] 6.0 6.0 6.0 6.0 6.1 6.1 6.1 6.1 6.1 6.1 6.2 6.2 6.2 6.2 6.3 6.3 6.3
## [103] 6.3 6.3 6.3 6.3 6.3 6.3 6.4 6.4 6.4 6.4 6.4 6.4 6.4 6.5 6.5 6.5 6.5
## [120] 6.5 6.6 6.6 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.8 6.8 6.8 6.9 6.9 6.9
## [137] 6.9 7.0 7.1 7.2 7.2 7.2 7.3 7.4 7.6 7.7 7.7 7.7 7.7 7.9
i <- order(iris$Sepal.Length, decreasing = TRUE) # 내림차순의 순서
iris$Sepal.Length[i] # 내림차순 정렬## [1] 7.9 7.7 7.7 7.7 7.7 7.6 7.4 7.3 7.2 7.2 7.2 7.1 7.0 6.9 6.9 6.9 6.9
## [18] 6.8 6.8 6.8 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.7 6.6 6.6 6.5 6.5 6.5 6.5
## [35] 6.5 6.4 6.4 6.4 6.4 6.4 6.4 6.4 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.3 6.3
## [52] 6.2 6.2 6.2 6.2 6.1 6.1 6.1 6.1 6.1 6.1 6.0 6.0 6.0 6.0 6.0 6.0 5.9
## [69] 5.9 5.9 5.8 5.8 5.8 5.8 5.8 5.8 5.8 5.7 5.7 5.7 5.7 5.7 5.7 5.7 5.7
## [86] 5.6 5.6 5.6 5.6 5.6 5.6 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.4 5.4 5.4 5.4
## [103] 5.4 5.4 5.3 5.2 5.2 5.2 5.2 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.1 5.0
## [120] 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 4.9 4.9 4.9 4.9 4.9 4.9 4.8 4.8
## [137] 4.8 4.8 4.8 4.7 4.7 4.6 4.6 4.6 4.6 4.5 4.4 4.4 4.4 4.3
- 순서를 제시하는 특징을 이용해 데이터 프레임을 정렬한다
iris[order(iris$Sepal.Width),] # data를 Sepal.Width 기준으로 정렬## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 61 5.0 2.0 3.5 1.0 versicolor
## 63 6.0 2.2 4.0 1.0 versicolor
## 69 6.2 2.2 4.5 1.5 versicolor
## 120 6.0 2.2 5.0 1.5 virginica
## 42 4.5 2.3 1.3 0.3 setosa
## 54 5.5 2.3 4.0 1.3 versicolor
## 88 6.3 2.3 4.4 1.3 versicolor
## 94 5.0 2.3 3.3 1.0 versicolor
## 58 4.9 2.4 3.3 1.0 versicolor
## 81 5.5 2.4 3.8 1.1 versicolor
## 82 5.5 2.4 3.7 1.0 versicolor
## 70 5.6 2.5 3.9 1.1 versicolor
## 73 6.3 2.5 4.9 1.5 versicolor
## 90 5.5 2.5 4.0 1.3 versicolor
## 99 5.1 2.5 3.0 1.1 versicolor
## 107 4.9 2.5 4.5 1.7 virginica
## 109 6.7 2.5 5.8 1.8 virginica
## 114 5.7 2.5 5.0 2.0 virginica
## 147 6.3 2.5 5.0 1.9 virginica
## 80 5.7 2.6 3.5 1.0 versicolor
## 91 5.5 2.6 4.4 1.2 versicolor
## 93 5.8 2.6 4.0 1.2 versicolor
## 119 7.7 2.6 6.9 2.3 virginica
## 135 6.1 2.6 5.6 1.4 virginica
## 60 5.2 2.7 3.9 1.4 versicolor
## 68 5.8 2.7 4.1 1.0 versicolor
## 83 5.8 2.7 3.9 1.2 versicolor
## 84 6.0 2.7 5.1 1.6 versicolor
## 95 5.6 2.7 4.2 1.3 versicolor
## 102 5.8 2.7 5.1 1.9 virginica
## 112 6.4 2.7 5.3 1.9 virginica
## 124 6.3 2.7 4.9 1.8 virginica
## 143 5.8 2.7 5.1 1.9 virginica
## 55 6.5 2.8 4.6 1.5 versicolor
## 56 5.7 2.8 4.5 1.3 versicolor
## 72 6.1 2.8 4.0 1.3 versicolor
## 74 6.1 2.8 4.7 1.2 versicolor
## 77 6.8 2.8 4.8 1.4 versicolor
## 100 5.7 2.8 4.1 1.3 versicolor
## 115 5.8 2.8 5.1 2.4 virginica
## 122 5.6 2.8 4.9 2.0 virginica
## 123 7.7 2.8 6.7 2.0 virginica
## 127 6.2 2.8 4.8 1.8 virginica
## 129 6.4 2.8 5.6 2.1 virginica
## 131 7.4 2.8 6.1 1.9 virginica
## 133 6.4 2.8 5.6 2.2 virginica
## 134 6.3 2.8 5.1 1.5 virginica
## 9 4.4 2.9 1.4 0.2 setosa
## 59 6.6 2.9 4.6 1.3 versicolor
## 64 6.1 2.9 4.7 1.4 versicolor
## 65 5.6 2.9 3.6 1.3 versicolor
## 75 6.4 2.9 4.3 1.3 versicolor
## 79 6.0 2.9 4.5 1.5 versicolor
## 97 5.7 2.9 4.2 1.3 versicolor
## 98 6.2 2.9 4.3 1.3 versicolor
## 104 6.3 2.9 5.6 1.8 virginica
## 108 7.3 2.9 6.3 1.8 virginica
## 2 4.9 3.0 1.4 0.2 setosa
## 13 4.8 3.0 1.4 0.1 setosa
## 14 4.3 3.0 1.1 0.1 setosa
## 26 5.0 3.0 1.6 0.2 setosa
## 39 4.4 3.0 1.3 0.2 setosa
## 46 4.8 3.0 1.4 0.3 setosa
## 62 5.9 3.0 4.2 1.5 versicolor
## 67 5.6 3.0 4.5 1.5 versicolor
## 76 6.6 3.0 4.4 1.4 versicolor
## 78 6.7 3.0 5.0 1.7 versicolor
## 85 5.4 3.0 4.5 1.5 versicolor
## 89 5.6 3.0 4.1 1.3 versicolor
## 92 6.1 3.0 4.6 1.4 versicolor
## 96 5.7 3.0 4.2 1.2 versicolor
## 103 7.1 3.0 5.9 2.1 virginica
## 105 6.5 3.0 5.8 2.2 virginica
## 106 7.6 3.0 6.6 2.1 virginica
## 113 6.8 3.0 5.5 2.1 virginica
## 117 6.5 3.0 5.5 1.8 virginica
## 128 6.1 3.0 4.9 1.8 virginica
## 130 7.2 3.0 5.8 1.6 virginica
## 136 7.7 3.0 6.1 2.3 virginica
## 139 6.0 3.0 4.8 1.8 virginica
## 146 6.7 3.0 5.2 2.3 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 150 5.9 3.0 5.1 1.8 virginica
## 4 4.6 3.1 1.5 0.2 setosa
## 10 4.9 3.1 1.5 0.1 setosa
## 31 4.8 3.1 1.6 0.2 setosa
## 35 4.9 3.1 1.5 0.2 setosa
## 53 6.9 3.1 4.9 1.5 versicolor
## 66 6.7 3.1 4.4 1.4 versicolor
## 87 6.7 3.1 4.7 1.5 versicolor
## 138 6.4 3.1 5.5 1.8 virginica
## 140 6.9 3.1 5.4 2.1 virginica
## 141 6.7 3.1 5.6 2.4 virginica
## 142 6.9 3.1 5.1 2.3 virginica
## 3 4.7 3.2 1.3 0.2 setosa
## 30 4.7 3.2 1.6 0.2 setosa
## 36 5.0 3.2 1.2 0.2 setosa
## 43 4.4 3.2 1.3 0.2 setosa
## 48 4.6 3.2 1.4 0.2 setosa
## 51 7.0 3.2 4.7 1.4 versicolor
## 52 6.4 3.2 4.5 1.5 versicolor
## 71 5.9 3.2 4.8 1.8 versicolor
## 111 6.5 3.2 5.1 2.0 virginica
## 116 6.4 3.2 5.3 2.3 virginica
## 121 6.9 3.2 5.7 2.3 virginica
## 126 7.2 3.2 6.0 1.8 virginica
## 144 6.8 3.2 5.9 2.3 virginica
## 24 5.1 3.3 1.7 0.5 setosa
## 50 5.0 3.3 1.4 0.2 setosa
## 57 6.3 3.3 4.7 1.6 versicolor
## 101 6.3 3.3 6.0 2.5 virginica
## 125 6.7 3.3 5.7 2.1 virginica
## 145 6.7 3.3 5.7 2.5 virginica
## 7 4.6 3.4 1.4 0.3 setosa
## 8 5.0 3.4 1.5 0.2 setosa
## 12 4.8 3.4 1.6 0.2 setosa
## 21 5.4 3.4 1.7 0.2 setosa
## 25 4.8 3.4 1.9 0.2 setosa
## 27 5.0 3.4 1.6 0.4 setosa
## 29 5.2 3.4 1.4 0.2 setosa
## 32 5.4 3.4 1.5 0.4 setosa
## 40 5.1 3.4 1.5 0.2 setosa
## 86 6.0 3.4 4.5 1.6 versicolor
## 137 6.3 3.4 5.6 2.4 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 1 5.1 3.5 1.4 0.2 setosa
## 18 5.1 3.5 1.4 0.3 setosa
## 28 5.2 3.5 1.5 0.2 setosa
## 37 5.5 3.5 1.3 0.2 setosa
## 41 5.0 3.5 1.3 0.3 setosa
## 44 5.0 3.5 1.6 0.6 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 23 4.6 3.6 1.0 0.2 setosa
## 38 4.9 3.6 1.4 0.1 setosa
## 110 7.2 3.6 6.1 2.5 virginica
## 11 5.4 3.7 1.5 0.2 setosa
## 22 5.1 3.7 1.5 0.4 setosa
## 49 5.3 3.7 1.5 0.2 setosa
## 19 5.7 3.8 1.7 0.3 setosa
## 20 5.1 3.8 1.5 0.3 setosa
## 45 5.1 3.8 1.9 0.4 setosa
## 47 5.1 3.8 1.6 0.2 setosa
## 118 7.7 3.8 6.7 2.2 virginica
## 132 7.9 3.8 6.4 2.0 virginica
## 6 5.4 3.9 1.7 0.4 setosa
## 17 5.4 3.9 1.3 0.4 setosa
## 15 5.8 4.0 1.2 0.2 setosa
## 33 5.2 4.1 1.5 0.1 setosa
## 34 5.5 4.2 1.4 0.2 setosa
## 16 5.7 4.4 1.5 0.4 setosa
iris[order(iris$Sepal.Width, iris$Petal.Width),] # 두 개 컬럼을 기준으로## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 61 5.0 2.0 3.5 1.0 versicolor
## 63 6.0 2.2 4.0 1.0 versicolor
## 69 6.2 2.2 4.5 1.5 versicolor
## 120 6.0 2.2 5.0 1.5 virginica
## 42 4.5 2.3 1.3 0.3 setosa
## 94 5.0 2.3 3.3 1.0 versicolor
## 54 5.5 2.3 4.0 1.3 versicolor
## 88 6.3 2.3 4.4 1.3 versicolor
## 58 4.9 2.4 3.3 1.0 versicolor
## 82 5.5 2.4 3.7 1.0 versicolor
## 81 5.5 2.4 3.8 1.1 versicolor
## 70 5.6 2.5 3.9 1.1 versicolor
## 99 5.1 2.5 3.0 1.1 versicolor
## 90 5.5 2.5 4.0 1.3 versicolor
## 73 6.3 2.5 4.9 1.5 versicolor
## 107 4.9 2.5 4.5 1.7 virginica
## 109 6.7 2.5 5.8 1.8 virginica
## 147 6.3 2.5 5.0 1.9 virginica
## 114 5.7 2.5 5.0 2.0 virginica
## 80 5.7 2.6 3.5 1.0 versicolor
## 91 5.5 2.6 4.4 1.2 versicolor
## 93 5.8 2.6 4.0 1.2 versicolor
## 135 6.1 2.6 5.6 1.4 virginica
## 119 7.7 2.6 6.9 2.3 virginica
## 68 5.8 2.7 4.1 1.0 versicolor
## 83 5.8 2.7 3.9 1.2 versicolor
## 95 5.6 2.7 4.2 1.3 versicolor
## 60 5.2 2.7 3.9 1.4 versicolor
## 84 6.0 2.7 5.1 1.6 versicolor
## 124 6.3 2.7 4.9 1.8 virginica
## 102 5.8 2.7 5.1 1.9 virginica
## 112 6.4 2.7 5.3 1.9 virginica
## 143 5.8 2.7 5.1 1.9 virginica
## 74 6.1 2.8 4.7 1.2 versicolor
## 56 5.7 2.8 4.5 1.3 versicolor
## 72 6.1 2.8 4.0 1.3 versicolor
## 100 5.7 2.8 4.1 1.3 versicolor
## 77 6.8 2.8 4.8 1.4 versicolor
## 55 6.5 2.8 4.6 1.5 versicolor
## 134 6.3 2.8 5.1 1.5 virginica
## 127 6.2 2.8 4.8 1.8 virginica
## 131 7.4 2.8 6.1 1.9 virginica
## 122 5.6 2.8 4.9 2.0 virginica
## 123 7.7 2.8 6.7 2.0 virginica
## 129 6.4 2.8 5.6 2.1 virginica
## 133 6.4 2.8 5.6 2.2 virginica
## 115 5.8 2.8 5.1 2.4 virginica
## 9 4.4 2.9 1.4 0.2 setosa
## 59 6.6 2.9 4.6 1.3 versicolor
## 65 5.6 2.9 3.6 1.3 versicolor
## 75 6.4 2.9 4.3 1.3 versicolor
## 97 5.7 2.9 4.2 1.3 versicolor
## 98 6.2 2.9 4.3 1.3 versicolor
## 64 6.1 2.9 4.7 1.4 versicolor
## 79 6.0 2.9 4.5 1.5 versicolor
## 104 6.3 2.9 5.6 1.8 virginica
## 108 7.3 2.9 6.3 1.8 virginica
## 13 4.8 3.0 1.4 0.1 setosa
## 14 4.3 3.0 1.1 0.1 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 26 5.0 3.0 1.6 0.2 setosa
## 39 4.4 3.0 1.3 0.2 setosa
## 46 4.8 3.0 1.4 0.3 setosa
## 96 5.7 3.0 4.2 1.2 versicolor
## 89 5.6 3.0 4.1 1.3 versicolor
## 76 6.6 3.0 4.4 1.4 versicolor
## 92 6.1 3.0 4.6 1.4 versicolor
## 62 5.9 3.0 4.2 1.5 versicolor
## 67 5.6 3.0 4.5 1.5 versicolor
## 85 5.4 3.0 4.5 1.5 versicolor
## 130 7.2 3.0 5.8 1.6 virginica
## 78 6.7 3.0 5.0 1.7 versicolor
## 117 6.5 3.0 5.5 1.8 virginica
## 128 6.1 3.0 4.9 1.8 virginica
## 139 6.0 3.0 4.8 1.8 virginica
## 150 5.9 3.0 5.1 1.8 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 103 7.1 3.0 5.9 2.1 virginica
## 106 7.6 3.0 6.6 2.1 virginica
## 113 6.8 3.0 5.5 2.1 virginica
## 105 6.5 3.0 5.8 2.2 virginica
## 136 7.7 3.0 6.1 2.3 virginica
## 146 6.7 3.0 5.2 2.3 virginica
## 10 4.9 3.1 1.5 0.1 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 31 4.8 3.1 1.6 0.2 setosa
## 35 4.9 3.1 1.5 0.2 setosa
## 66 6.7 3.1 4.4 1.4 versicolor
## 53 6.9 3.1 4.9 1.5 versicolor
## 87 6.7 3.1 4.7 1.5 versicolor
## 138 6.4 3.1 5.5 1.8 virginica
## 140 6.9 3.1 5.4 2.1 virginica
## 142 6.9 3.1 5.1 2.3 virginica
## 141 6.7 3.1 5.6 2.4 virginica
## 3 4.7 3.2 1.3 0.2 setosa
## 30 4.7 3.2 1.6 0.2 setosa
## 36 5.0 3.2 1.2 0.2 setosa
## 43 4.4 3.2 1.3 0.2 setosa
## 48 4.6 3.2 1.4 0.2 setosa
## 51 7.0 3.2 4.7 1.4 versicolor
## 52 6.4 3.2 4.5 1.5 versicolor
## 71 5.9 3.2 4.8 1.8 versicolor
## 126 7.2 3.2 6.0 1.8 virginica
## 111 6.5 3.2 5.1 2.0 virginica
## 116 6.4 3.2 5.3 2.3 virginica
## 121 6.9 3.2 5.7 2.3 virginica
## 144 6.8 3.2 5.9 2.3 virginica
## 50 5.0 3.3 1.4 0.2 setosa
## 24 5.1 3.3 1.7 0.5 setosa
## 57 6.3 3.3 4.7 1.6 versicolor
## 125 6.7 3.3 5.7 2.1 virginica
## 101 6.3 3.3 6.0 2.5 virginica
## 145 6.7 3.3 5.7 2.5 virginica
## 8 5.0 3.4 1.5 0.2 setosa
## 12 4.8 3.4 1.6 0.2 setosa
## 21 5.4 3.4 1.7 0.2 setosa
## 25 4.8 3.4 1.9 0.2 setosa
## 29 5.2 3.4 1.4 0.2 setosa
## 40 5.1 3.4 1.5 0.2 setosa
## 7 4.6 3.4 1.4 0.3 setosa
## 27 5.0 3.4 1.6 0.4 setosa
## 32 5.4 3.4 1.5 0.4 setosa
## 86 6.0 3.4 4.5 1.6 versicolor
## 149 6.2 3.4 5.4 2.3 virginica
## 137 6.3 3.4 5.6 2.4 virginica
## 1 5.1 3.5 1.4 0.2 setosa
## 28 5.2 3.5 1.5 0.2 setosa
## 37 5.5 3.5 1.3 0.2 setosa
## 18 5.1 3.5 1.4 0.3 setosa
## 41 5.0 3.5 1.3 0.3 setosa
## 44 5.0 3.5 1.6 0.6 setosa
## 38 4.9 3.6 1.4 0.1 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 23 4.6 3.6 1.0 0.2 setosa
## 110 7.2 3.6 6.1 2.5 virginica
## 11 5.4 3.7 1.5 0.2 setosa
## 49 5.3 3.7 1.5 0.2 setosa
## 22 5.1 3.7 1.5 0.4 setosa
## 47 5.1 3.8 1.6 0.2 setosa
## 19 5.7 3.8 1.7 0.3 setosa
## 20 5.1 3.8 1.5 0.3 setosa
## 45 5.1 3.8 1.9 0.4 setosa
## 132 7.9 3.8 6.4 2.0 virginica
## 118 7.7 3.8 6.7 2.2 virginica
## 6 5.4 3.9 1.7 0.4 setosa
## 17 5.4 3.9 1.3 0.4 setosa
## 15 5.8 4.0 1.2 0.2 setosa
## 33 5.2 4.1 1.5 0.1 setosa
## 34 5.5 4.2 1.4 0.2 setosa
## 16 5.7 4.4 1.5 0.4 setosa
2.5.3 with
- 데이터의 이름을 사용하지 않고 바로 컬럼명을 사용하게 하기 때문에 가독성이 높다
- 아래 두 명령어는 같은 결과를 출력한다.
with(iris, sum(Sepal.Length))## [1] 876.5
sum(iris$Sepal.Length) ## [1] 876.5
- with()는 ifelse 구문과 함께 쓰여 데이터에 결과를 추가할 때 쓰일 때가 많다.
with(iris, ifelse(Sepal.Length > 5.0, "High", "Low"))## [1] "High" "Low" "Low" "Low" "Low" "High" "Low" "Low" "Low" "Low"
## [11] "High" "Low" "Low" "Low" "High" "High" "High" "High" "High" "High"
## [21] "High" "High" "Low" "High" "Low" "Low" "Low" "High" "High" "Low"
## [31] "Low" "High" "High" "High" "Low" "Low" "High" "Low" "Low" "High"
## [41] "Low" "Low" "Low" "Low" "High" "Low" "High" "Low" "High" "Low"
## [51] "High" "High" "High" "High" "High" "High" "High" "Low" "High" "High"
## [61] "Low" "High" "High" "High" "High" "High" "High" "High" "High" "High"
## [71] "High" "High" "High" "High" "High" "High" "High" "High" "High" "High"
## [81] "High" "High" "High" "High" "High" "High" "High" "High" "High" "High"
## [91] "High" "High" "High" "Low" "High" "High" "High" "High" "High" "High"
## [101] "High" "High" "High" "High" "High" "High" "Low" "High" "High" "High"
## [111] "High" "High" "High" "High" "High" "High" "High" "High" "High" "High"
## [121] "High" "High" "High" "High" "High" "High" "High" "High" "High" "High"
## [131] "High" "High" "High" "High" "High" "High" "High" "High" "High" "High"
## [141] "High" "High" "High" "High" "High" "High" "High" "High" "High" "High"
# sepal.Length 가 5.0 이상이면, high, 아니면 Low를 출력한다
# 이 결과를 원 데이터에 덧붙이려면 다음과 같다
iris$Sepal.Length.Judge <- with(iris, ifelse(Sepal.Length > 5.0, "High", "Low"))연습문제
- mtcars의 차량 중 가장 높은 마력 5개
mtcars## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
i <- order(mtcars$hp, decreasing = TRUE)
head(mtcars$hp[i], 5)## [1] 335 264 245 245 230
lapply(mtcars, sort, decreasing = T)[['hp']][c(1:5)]## [1] 335 264 245 245 230
- 가장 낮은 mpg 5개
ii <- order(mtcars$mpg)
head(mtcars$hp[ii], 5)## [1] 205 215 245 245 230
lapply(mtcars, sort)[['mpg']][c(1:5)]## [1] 10.4 10.4 13.3 14.3 14.7
- mtcars를 마력이 높은 순으로 데이터를 정렬하시오, 가장 높은 마력을 갖는 차종은 무엇인가
rownames(mtcars[order(mtcars$hp),] [1,])## [1] "Honda Civic"
- mtcars 중에서 기어수가 가장 많으면서, 가장 많은 실린더를 갖는 차종은 무엇인가
rownames(mtcars[order(mtcars$gear, mtcars$cyl), ] [1,]) ## [1] "Toyota Corona"