matrixdata.frame의 조작

  • apply(), sweep(), 그리고 outer()는 매트릭스와 동작
  • tapply()는 그룹화할때 사용

matrix와 array

a = matrix(1:20, nrow=5)
a
##      [,1] [,2] [,3] [,4]
## [1,]    1    6   11   16
## [2,]    2    7   12   17
## [3,]    3    8   13   18
## [4,]    4    9   14   19
## [5,]    5   10   15   20
  • apply
apply(a, 1, mean)
## [1]  8.5  9.5 10.5 11.5 12.5
apply(a, 2, mean)
## [1]  3  8 13 18

x = matrix(rnorm(20, mean=0, sd=10), nrow=4)
x
##            [,1]         [,2]         [,3]      [,4]      [,5]
## [1,]  -9.934007  0.006597635  -3.84921296  6.084250  6.165411
## [2,] -20.017956  1.991361506  -7.30670901  5.212370 -9.884440
## [3,]  -5.166649 -9.524993094  -0.08221195  3.766401 12.265300
## [4,]   6.278801 -2.190847659 -15.43569788 11.086988  4.038638
  • sweep()
# apply로 최솟값을 구한 후 각 원소에서 최솟값을 뺀다.
x1 = sweep(x, 1, apply(x, 1, min), `-`) 
x1
##           [,1]      [,2]      [,3]     [,4]     [,5]
## [1,]  0.000000  9.940604  6.084794 16.01826 16.09942
## [2,]  0.000000 22.009317 12.711247 25.23033 10.13352
## [3,]  4.358344  0.000000  9.442781 13.29139 21.79029
## [4,] 21.714499 13.244850  0.000000 26.52269 19.47434
# 최솟값을 뺀 후 각행을 최대값을 나눈다.
# 이는 python의 scikit-learn의 MinMaxScaler()와 같은 전처리와 같다.
x2 = sweep(x1, 1, apply(x, 1, max), `/`) 
x2
##           [,1]     [,2]      [,3]     [,4]     [,5]
## [1,] 0.0000000 1.612318 0.9869242 2.598084 2.611248
## [2,] 0.0000000 4.222517 2.4386695 4.840471 1.944128
## [3,] 0.3553394 0.000000 0.7698777 1.083658 1.776581
## [4,] 1.9585570 1.194630 0.0000000 2.392235 1.756504

  • outer()
# 첫번째 열에 1:3을 채우고, 첫번째 행에 1:10 까지 채운다
# 그리고 나머지 원소는 "*"를 이용하여 곱한 원소로 채운다
outer(1:3, 1:10, "*")
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,]    1    2    3    4    5    6    7    8    9    10
## [2,]    2    4    6    8   10   12   14   16   18    20
## [3,]    3    6    9   12   15   18   21   24   27    30

'R > functional' 카테고리의 다른 글

parallelize  (0) 2018.06.06
lapply  (0) 2018.06.06
parallelize.utf8

parallelize

parallel::mclapply(), parallel::mcMap() windows에서는 사용할 수 없고, mac에서만 사용할 수 있음

require(parallel)
## Loading required package: parallel
cores = detectCores() # 4

unlist(mclapply(21:30, sqrt, mc.cores=4))
##  [1] 4.582576 4.690416 4.795832 4.898979 5.000000 5.099020 5.196152
##  [8] 5.291503 5.385165 5.477226

이 경우에서, mclapply()는 실제로 lapply()보다 느리다. 여러 코어에 계산을 보내고 결과를 수집하기 때문이다. 다음 예를 통해 이를 확인해보면 다음과 같다

boot_df = function(x){
        x[sample(nrow(x), replace=TRUE), ]
}

rsquared = function(model){
        summary(model)$r.square
}
boot_lm = function(i){
        rsquared(lm(mpg~wt+disp, data=boot_df(mtcars)))
}

system.time(lapply(1:5000, boot_lm)) # 5000번 반복
##    user  system elapsed 
##   5.746   0.068   5.975
cores = detectCores()
system.time(mclapply(1:5000, boot_lm, mc.cores=cores)) # 5000번 반복
##    user  system elapsed 
##   6.969   0.253   3.141

'R > functional' 카테고리의 다른 글

data_frame, apply  (0) 2018.06.07
lapply  (0) 2018.06.06
  • 1000개의 무작위 균일 난수를 입력으로 제공받은 함수를 호출

# 임의의 무작위 데이터를 생성
l = replicate(20, rnorm(sample(1:10, 1), mean=0, sd=1), simplify=FALSE)

# for 루프로 작성

out = vector("list", length(l))
for (i in seq(l)) {
    out[[i]] = length(l[[i]])
}
unlist(out)
##  [1]  5  4  5  9 10  3  5  3  3  9  1 10  9  5  8  9  2  9 10  9
# lapply로 작성
unlist(lapply(l, length))
##  [1]  5  4  5  9 10  3  5  3  3  9  1 10  9  5  8  9  2  9 10  9

  • data.frame에 lapply 적용하기

# 평균(mean)으로 각 열을 나눔
mtcars[] = lapply(mtcars, function(x){
        x/mean(x) # x에는 data.frame의 각 열이 들어옴
    })

  • for문 사용

xs = runif(1e4)
res = c()

# 첫번째 방법
for (x in xs) {
    res = c(res, sqrt(x))
}

res = numeric(length(xs)) # numeric : 길이만큼 0벡터 만듬
for (i in seq(xs)) {
    res[i] = sqrt(xs[i])
    }

  • lapply로 구현하기

xs = runif(1e4)
ret = unlist(lapply(xs, function(x){
       sqrt(x)
    }))
ret[1:10]
##  [1] 0.4223976 0.5768065 0.9410556 0.2452229 0.8626159 0.9631699 0.5534060
##  [8] 0.6318466 0.8488031 0.8736057
res = numeric(length(xs))
ret = unlist(lapply(seq(xs), function(i){
        res[i] = sqrt(xs[i])
    }))
ret[1:10]
##  [1] 0.4223976 0.5768065 0.9410556 0.2452229 0.8626159 0.9631699 0.5534060
##  [8] 0.6318466 0.8488031 0.8736057

'R > functional' 카테고리의 다른 글

data_frame, apply  (0) 2018.06.07
parallelize  (0) 2018.06.06

+ Recent posts