2. 데이터 전처리 2

2.1 행과 열의 계산 - apply 계열 함수

  • 입력된 데이터 전체에 같은 계산을 수행하게 하는 함수.

2.1.1 apply 함수 - apply(x,1 or 2,func)

  • 행 또는 열 방향으로 계산.
  • 입력 데이터 : 행렬, 배열 / 결과 데이터 : 벡터
  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
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
  1. 사용자 정의 함수와의 결합
  • 함수 생성법
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)

  • 데이터의 각 요소에 특정 함수를 적용
  • 입력 데이터 : 벡터, 데이터프레임, 리스트 / 결과 데이터 : 리스트
  1. 기본 사용법
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"
  1. 결과 변환 - 리스트형태 -> 데이터 프레임
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)

  • 데이터의 각 요소에 특정 함수를 적용
  • 입력 데이터 : 벡터, 데이터프레임, 리스트 / 결과 데이터 : 벡터, 행렬
  • 결과를 벡터로 만들어 준다.
  1. 기본 사용
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
  1. 결과 변환
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
  1. 행렬로 출력 되는 경우
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()

  1. 같은 종류의 원소로 구성되어 있을 때.
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
  1. 다른 종류의 원소로 구성되어 있을 때.
  • 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()

  • 공통 컬럼을 기준으로 통합
  1. 기본 사용법
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
  1. 공통 컬럼은 하나인 것이 좋다. 단, 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
  1. 공통 컬럼에 공통값이 없으면 해당 값은 제외, 살리고 싶다면 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 연습문제

  1. 타이타닉 셋에서 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)]
  1. test.csv가져와서 동일한 feature를 추출하여 selected_test에 저장
ttest=read.csv("data/Titanic/test.csv")
selected_test=ttest[c(2,4,5,6,7,9,11)]
  1. 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 연습문제

  1. 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,적용함수)

  1. 기본 사용
with(iris,sum(Sepal.Length))
## [1] 876.5
with(iris,mean(Sepal.Length))
## [1] 5.843333
  1. ifelse와 결합
head(with(iris,ifelse(Sepal.Length>5,"High","Low")))
## [1] "High" "Low"  "Low"  "Low"  "Low"  "High"

2.4.4 정렬 컬럼 접근 4 - within()

  1. 해당 컬럼의 내용을 직접 변화 시킬 때 사용
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
  1. 결측치를 다른 값으로 바꿀 때 유용하게 사용
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
  1. 복수 명령문에 with/within 사용
with(iris,{
  print(mean(Sepal.Length))
  print(mean(Sepal.Width))
}
)
## [1] 5.842667
## [1] 3.057333

2.4.5 연습문제

  1. 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"
  1. mtcars의 차량 중 가장 낮은 mpg 5개 구하기
rownames(mtcars[order(mtcars$mpg)[1:5],])
## [1] "Cadillac Fleetwood"  "Lincoln Continental" "Camaro Z28"         
## [4] "Duster 360"          "Chrysler Imperial"
  1. 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
  1. 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