2. 데이터 전처리 2
2.1 행과 열의 계산 - apply 계열 함수
- 입력된 데이터 전체에 같은 계산을 수행하게 하는 함수.
2.1.1 apply 함수 - apply(x,1 or 2,func)
- 행 또는 열 방향으로 계산.
- 입력 데이터 : 행렬, 배열 / 결과 데이터 : 벡터
- 기본 사용법
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
apply(m,1,sqrt) # 1은 행방향, 행방향으로 계산해도 결과는 열 방향으로 저장. ## [,1] [,2] [,3]
## [1,] 1.000000 1.414214 1.732051
## [2,] 2.000000 2.236068 2.449490
## [3,] 2.645751 2.828427 3.000000
- 사용자 정의 함수와의 결합
- 함수 생성법
say=function(s){
print("input sentence is")
print(s)
}
say("hello world")## [1] "input sentence is"
## [1] "hello world"
final.score=function(name,current.score)
{
print(name)
print(paste("your final score:",current.score+2))
}
final.score("baek",95)## [1] "baek"
## [1] "your final score: 97"
- if문 연습
a=2
if(a==3)
{
print("3 입니다")
}else if(a==2)
{
print("2 입니다")
}else
{
print(a)
}## [1] "2 <U+C785><U+B2C8><U+B2E4>"
- for문 연습
x=1:10
for(i in 1:length(x))
{
print(i)
}## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
- 사용자 정의 함수와의 연계 1 - 아규먼트가 1개 있는 경우
my.func1=function(m)
{
m^2-2*m+3
}
m=matrix(1:9,ncol=3)
apply(m,2,my.func1)## [,1] [,2] [,3]
## [1,] 2 11 38
## [2,] 3 18 51
## [3,] 6 27 66
- 사용자 정의 함수와의 연계 2 - 아규먼트가 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
- 사용자 정의 함수와의 연계 3 - 아규먼트가 3개 있는 경우
my.func3=function(m,arg1,arg2)
{
m+arg1+arg2^2
}
apply(m,2,my.func3,2,3)## [,1] [,2] [,3]
## [1,] 12 15 18
## [2,] 13 16 19
## [3,] 14 17 20
- 기초통계 함수와의 연계
apply(m,2,sum)## [1] 6 15 24
apply(m,1,sum)## [1] 12 15 18
- iris 데이터 연습
head(iris)## 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
apply(iris[,1:4],2,sum) # iris 열 방향으로 합 구하기 ## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 876.5 458.6 563.7 179.9
- colSums계열 함수 - rowSums(), rowMeans(), colSums(), colMeans()
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 함수 - lapply(x,func)
- 데이터의 각 요소에 특정 함수를 적용
- 입력 데이터 : 벡터, 데이터프레임, 리스트 / 결과 데이터 : 리스트
- 기본 사용법
x=1:3
lapply(x,sqrt)## [[1]]
## [1] 1
##
## [[2]]
## [1] 1.414214
##
## [[3]]
## [1] 1.732051
l=lapply(iris[,1:4],sum)
class(l) # 리스트 형태의 결과 값## [1] "list"
- 결과 변환 - 리스트형태 -> 데이터 프레임
v=unlist(l) # numeric 으로 변환
v## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 876.5 458.6 563.7 179.9
class(v) ## [1] "numeric"
m=matrix(v,ncol=4)
d=as.data.frame(m)
names(d)=names(iris[,1:4])
d## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 876.5 458.6 563.7 179.9
2.1.3 lapply 연습
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
v3[v3==5]## V12
## 5
2.1.4 sapply 함수 - sapply(x,func)
- 데이터의 각 요소에 특정 함수를 적용
- 입력 데이터 : 벡터, 데이터프레임, 리스트 / 결과 데이터 : 벡터, 행렬
- 결과를 벡터로 만들어 준다.
- 기본 사용
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)
class(m)## [1] "matrix"
df=as.data.frame(m)
head(df)## Sepal.Length Sepal.Width
## 1 2.258318 1.870829
## 2 2.213594 1.732051
## 3 2.167948 1.788854
## 4 2.144761 1.760682
## 5 2.236068 1.897367
## 6 2.323790 1.974842
2.1.5 tapply 함수 - tapply(업데이트 컬럼,기준컬럼,func-데이터에 적용할 함수)
- 팩터로 그룹화 된 변수에 대해 그룹별로 함수를 적용
- 입력 데이터 : 벡터 / 결과 데이터 : 배열
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)## F M
## 325 170
tapply(df$height,df$gender,sqrt)## $F
## [1] 12.64911 12.84523
##
## $M
## [1] 13.0384
2.1.6 연습
2.1 mtcars 변수 평균
head(mtcars)## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
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
2.2 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
3.1 각 차종별 모든 행의 합
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
3.2 merc~ 변수 평균
rowMeans(mtcars)[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
4.1 lapply 벡터 변환
l=lapply(mtcars,sum) # list
v=unlist(l)
v## mpg cyl disp hp drat wt qsec vs
## 642.900 198.000 7383.100 4694.000 115.090 102.952 571.160 14.000
## am gear carb
## 13.000 118.000 90.000
4.2 sapply로 요소 별 모든 합
sapply(mtcars,sum)## mpg cyl disp hp drat wt qsec vs
## 642.900 198.000 7383.100 4694.000 115.090 102.952 571.160 14.000
## am gear carb
## 13.000 118.000 90.000
5.1 tapply로 vs가 0인 모델과 vs가 1인 모델의 마력 평균 차이
mean=tapply(mtcars$hp,mtcars$vs,mean)
mean[1]-mean[2]## 0
## 98.36508
5.2 Gear에 따른 각 모델의 마력
tapply(mtcars$hp,mtcars$gear,mean)## 3 4 5
## 176.1333 89.5000 195.6000
tapply(mtcars$hp,mtcars$gear,table)## $`3`
##
## 97 105 110 150 175 180 205 215 230 245
## 1 1 1 2 2 3 1 1 1 2
##
## $`4`
##
## 52 62 65 66 93 95 109 110 123
## 1 1 1 2 1 1 1 2 2
##
## $`5`
##
## 91 113 175 264 335
## 1 1 1 1 1
6
txt=readLines("data/sample.txt")
# noun=lapply(txt,getMorph,"noun") # txt파일을 "noun"이라는 아규먼트에 따라 리스트 형태로 배출2.2 행과 열의 병합
2.2.1 행과 열의 병합 1 - rbind()
- 같은 종류의 원소로 구성되어 있을 때.
x=c(1:5)
y=c(seq(10,50,10))
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
- 다른 종류의 원소로 구성되어 있을 때.
- str(iris)와 str(d)를 비교해보면, 1,2,3,4를 “chr”로 인식함을 알 수 있다.
d=rbind(iris,c(1,2,3,4,"setosa"))
tail(d,3)## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3 5.1 1.8 virginica
## 151 1 2 3 4 setosa
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 ...
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)
tail(d2,3)## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 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
str(d2)## 'data.frame': 151 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 ...
2.2.2 행과 열의 병합 2 - cbind()
- cbind()는 기본적으로 행렬을 만들다.
- 데이터 구조를 유지하기 위해서는 데이터 프레임을 먼저 만들어야한다.
iris.sepal.lw=cbind(iris$Sepal.Length,iris$Sepal.Width)
head(iris.sepal.lw,2)## [,1] [,2]
## [1,] 5.1 3.5
## [2,] 4.9 3.0
class(iris.sepal.lw) ## [1] "matrix"
x=c(1:5)
y=c(seq(10,50,10))
z=c("M","M","M","F","F")
d=data.frame(x)
d=cbind(x,y,z)
d # mac에서는 stringAsFactors가 잘 작동되지 않음.## x y z
## [1,] "1" "10" "M"
## [2,] "2" "20" "M"
## [3,] "3" "30" "M"
## [4,] "4" "40" "F"
## [5,] "5" "50" "F"
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
d## x y z
## 1 1 10 M
## 2 2 20 M
## 3 3 30 M
## 4 4 40 F
## 5 5 50 F
str(d)## 'data.frame': 5 obs. of 3 variables:
## $ x: num 1 2 3 4 5
## $ y: num 10 20 30 40 50
## $ z: chr "M" "M" "M" "F" ...
2.2.3 연습문제
newiris=cbind(iris$Sepal.Length,iris$Sepal.Width,iris$Species)
newiris=as.data.frame(newiris)
str(newiris)## 'data.frame': 150 obs. of 3 variables:
## $ V1: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ V2: num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ V3: num 1 1 1 1 1 1 1 1 1 1 ...
2.2.4 행과 열의 병합 3 - merge()
- 공통 컬럼을 기준으로 통합
- 기본 사용법
name=c("James","Mary","John")
math=c(70,80,90)
d1=data.frame(name,math)
name=c("James","John","Mary")
english=c(80,70,90)
d2=data.frame(name,english)
merge(d1,d2)## name math english
## 1 James 70 80
## 2 John 90 70
## 3 Mary 80 90
- 공통 컬럼은 하나인 것이 좋다. 단, by옵션 사용가능.
age=c(72,73,74)
d1=data.frame(name,age,math)
age=c(72,74,73)
d2=data.frame(name,age,english)
merge(d1,d2,by="name")## name age.x math age.y english
## 1 James 72 70 72 80
## 2 John 73 80 74 70
## 3 Mary 74 90 73 90
- 공통 컬럼에 공통값이 없으면 해당 값은 제외, 살리고 싶다면 all=TRUE 지정
name=c("James","Mary","John","Lion")
age=c(72,73,74,89)
math=c(70,80,90,100)
d1=data.frame(name,age,math)
name=c("James","John","Mary")
year=c(72,74,73)
english=c(80,70,90)
d2=data.frame(name,year,english)
merge(d1,d2)## name age math year english
## 1 James 72 70 72 80
## 2 John 74 90 74 70
## 3 Mary 73 80 73 90
left_join(d1,d2)## Joining, by = "name"
## Warning: Column `name` joining factors with different levels, coercing to
## character vector
## name age math year english
## 1 James 72 70 72 80
## 2 Mary 73 80 73 90
## 3 John 74 90 74 70
## 4 Lion 89 100 NA NA
merge(d1,d2,all = TRUE)## name age math year english
## 1 James 72 70 72 80
## 2 John 74 90 74 70
## 3 Lion 89 100 NA NA
## 4 Mary 73 80 73 90
2.2.5 연습문제
- 타이타닉 셋에서 pclass,sex,age,sibsp,parch,fare,embarked 추출 후 selected에 저장
ttrain=read.csv("data/Titanic/train.csv")
selected=ttrain[c(3,5,6,7,8,10,12)]- test.csv가져와서 동일한 feature를 추출하여 selected_test에 저장
ttest=read.csv("data/Titanic/test.csv")
selected_test=ttest[c(2,4,5,6,7,9,11)]- rbind를 활용하여 selected와 selected_test병합 후 all_data에 저장
all_data=rbind(selected,selected_test)2.3 행과 열의 요약
2.3.1 행과 열의 요약 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.3.2 행과 열의 요약 2 - doBy패키지 summaryBy()
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 Sepal.Length.mean Sepal.Width.mean
## 1 setosa 5.006 3.428
## 2 versicolor 5.936 2.770
## 3 virginica 6.588 2.974
2.3.3 연습문제
- all_data의 컬럼별 요약을 구하시오 (평균값,중앙값)
a=summary(all_data)
b=summary(selected)
a==b## Pclass Sex Age SibSp Parch Fare Embarked
## TRUE FALSE FALSE FALSE FALSE FALSE TRUE
## TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## TRUE NA TRUE FALSE FALSE FALSE FALSE
## FALSE NA FALSE FALSE FALSE FALSE FALSE
## TRUE NA FALSE FALSE FALSE FALSE NA
## TRUE NA TRUE FALSE FALSE FALSE NA
## NA NA FALSE NA NA NA NA
2.4 정렬 컬럼 접근
2.4.1 정렬 컬럼 접근 1 - sort()
x=c(1,30,22,27,51,38,45)
sort(x)## [1] 1 22 27 30 38 45 51
head(sort(iris$Sepal.Length))## [1] 4.3 4.4 4.4 4.4 4.5 4.6
head(sort(iris$Sepal.Length,decreasing = TRUE))## [1] 7.9 7.7 7.7 7.7 7.7 7.6
2.4.2 정렬 컬럼 접근 2 - order()
- index를 나타냄
- 특정행에 접근 가능
i=order(iris$Sepal.Length)
head(iris$Sepal.Length[i]) # 오름 차순 ## [1] 4.3 4.4 4.4 4.4 4.5 4.6
i2=order(iris$Sepal.Length,decreasing=TRUE)
head(iris$Sepal.Length[i2]) # 내림 차순## [1] 7.9 7.7 7.7 7.7 7.7 7.6
head(iris[order(iris$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
head(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
2.4.3 정렬 컬럼 접근 3 - with(data,적용함수)
- 기본 사용
with(iris,sum(Sepal.Length))## [1] 876.5
with(iris,mean(Sepal.Length))## [1] 5.843333
- ifelse와 결합
head(with(iris,ifelse(Sepal.Length>5,"High","Low")))## [1] "High" "Low" "Low" "Low" "Low" "High"
2.4.4 정렬 컬럼 접근 4 - within()
- 해당 컬럼의 내용을 직접 변화 시킬 때 사용
head(within(iris,Sepal.Length<-ifelse(Sepal.Length>5,"High","Low")))## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 High 3.5 1.4 0.2 setosa
## 2 Low 3.0 1.4 0.2 setosa
## 3 Low 3.2 1.3 0.2 setosa
## 4 Low 3.1 1.5 0.2 setosa
## 5 Low 3.6 1.4 0.2 setosa
## 6 High 3.9 1.7 0.4 setosa
- 결측치를 다른 값으로 바꿀 때 유용하게 사용
iris[1,1]=NA # 결측치 입력
head(iris,3) ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 NA 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
per_species=split(iris$Sepal.Length,iris$Species) # sepallength를 종류별로 분류
median_per_species=sapply(per_species,median,na.rm=TRUE) # 종류별 중앙 값 계산
median_per_species## setosa versicolor virginica
## 5.0 5.9 6.5
class(median_per_species)## [1] "numeric"
head(iris,3)## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 NA 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
iris=within(iris,Sepal.Length<-ifelse(is.na(Sepal.Length),median_per_species[Species],Sepal.Length))
head(iris,3)## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.0 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
- 복수 명령문에 with/within 사용
with(iris,{
print(mean(Sepal.Length))
print(mean(Sepal.Width))
}
)## [1] 5.842667
## [1] 3.057333
2.4.5 연습문제
- mtcars의 차량 중 가장 높은 마력 5개 구하기
rownames(mtcars[order(mtcars$hp,decreasing = T)[1:5],])## [1] "Maserati Bora" "Ford Pantera L" "Duster 360"
## [4] "Camaro Z28" "Chrysler Imperial"
rownames(mtcars[lapply(mtcars,order,decreasing=T)[["hp"]][c(1:5)],])## [1] "Maserati Bora" "Ford Pantera L" "Duster 360"
## [4] "Camaro Z28" "Chrysler Imperial"
- mtcars의 차량 중 가장 낮은 mpg 5개 구하기
rownames(mtcars[order(mtcars$mpg)[1:5],])## [1] "Cadillac Fleetwood" "Lincoln Continental" "Camaro Z28"
## [4] "Duster 360" "Chrysler Imperial"
- mtcars를 마력이 높은 순으로 데이터 정렬
head(mtcars[order(mtcars$hp,decreasing=TRUE),])## mpg cyl disp hp drat wt qsec vs am gear carb
## Maserati Bora 15.0 8 301 335 3.54 3.570 14.60 0 1 5 8
## Ford Pantera L 15.8 8 351 264 4.22 3.170 14.50 0 1 5 4
## Duster 360 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4
## Camaro Z28 13.3 8 350 245 3.73 3.840 15.41 0 0 3 4
## Chrysler Imperial 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4
## Lincoln Continental 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4
- mtcars에서 기어수가 가장 많으면서 가장 많은 실린더를 갖는 차종?
head(mtcars[order(mtcars$gear,mtcars$cyl,decreasing=TRUE),])## mpg cyl disp hp drat wt qsec vs am gear carb
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## 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
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
2.4.6 상위 n개 값 가져오기 함수 생성
top<-function(x, num, c1,c2){
sorted<-x[with(x,order(x[,c1],x[,c2],decreasing=T)),]
splits<-split(sorted,sorted[,c1])
df<-lapply(splits,head,num)
do.call(rbind.data.frame,df)}
# x 는 데이터 프레임입니다.
# num 은보고자하는 행 수입니다.
# c1 은 나누려 는 변수의 열 번호 입니다.
#c2 는 순위 지정하거나 관계를 처리하려는 변수의 열 번호 입니다.
# 이 함수는 mtcars 데이터를 사용하여 각 실린더 클래스에서 3 개의 가장 무거운 자동차 (mtcars $ cyl는 6 번째 열)를 추출합니다 (mtcars $ cyl는 2 번째 열임)
top(mtcars,3,2,6)## mpg cyl disp hp drat wt qsec vs am gear carb
## 4.Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## 4.Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## 4.Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
## 6.Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## 6.Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## 6.Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## 8.Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## 8.Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## 8.Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4