tidyverse 특집 / purrr 소개

purrr

tidyverse

무엇보다도 tidyverse를 먼저 불러와야한다.

library(tidyverse)

Map함수의 기본

purrr::map()은 함수에 파라미터를 반복적용하기 위해 사용된다. 예를 들어, rnorm(n=2,mean=1), rnorm(n=2,mean=2), rnorm(n=2,mean=3)… 등을 처리하는 경우를 생각해보자. for()를 쓰지 않고 map을 쓰면 다음과 같이 간단하게 처리할 수 있다. 결과값은 list이다.

map(1:5,rnorm,n=2)
[[1]]
[1]  1.5277437 -0.1681184

[[2]]
[1] 1.265389 2.071110

[[3]]
[1] 2.332851 2.908670

[[4]]
[1] 3.591315 2.631672

[[5]]
[1] 3.874069 5.216847

이제 위의 결과값을 받아(list 형태) 평균을 계산해보자. 각각의 list에 대해 함수를 적용하고 벡터로 결과를 바꾸려면 map_dbl()을 사용한다.

map(1:5,rnorm,n=2)%>%map_dbl(mean)
[1] 0.3867665 1.7964589 3.7069350 4.0836371 6.1565157

잘 되었는지 확인하기 위해 숫자를 좀 더 키워보자.

map(1:5,rnorm,n=10000)%>%map_dbl(mean)%>%round()
[1] 1 2 3 4 5

평균이 각각 1,..,5까지 잘 나왔다.

표현에 불만이 있다면 좀더 명시적으로 처리할 수도 있다.

map(1:5,function(x){rnorm(n=10000,x)})%>%map_dbl(mean)%>%round()
[1] 1 2 3 4 5

앞의 리스트 내 원소 각각을 x로 받아 함수처리하였다.

x1=10,x2=5라는 데이터에 각각 10을 더하거나 10을 곱하는 문제를 처리해보자. 이 때 원래 입력했던 리스트의 이름을 그대로 사용할 수 있다.

list(x1=10,x2=5)%>%map(`+`,10)
$x1
[1] 20

$x2
[1] 15

혹은

list(x1=10,x2=5)%>%map_dbl(`+`,10)
x1 x2 
20 15 

곱하기 문제도 마찬가지다.

list(x1=10,x2=5) %>% map_dbl(`*`,10)
 x1  x2 
100  50 

map에서 입력 벡터는 .x로 이를 처리하는 함수는 .f라고 한다. 이제 .x를 포뮬러 식을 활용하여 표현하자.

map(1:5,~rnorm(n=4,.x))
[[1]]
[1]  2.3600051  1.2917024 -0.1319451 -0.4141738

[[2]]
[1] 0.1138632 1.5781242 2.9005632 1.1331203

[[3]]
[1] 2.630215 2.114706 3.011688 6.533070

[[4]]
[1] 2.965172 4.577584 4.935349 3.300048

[[5]]
[1] 3.441916 3.124055 5.026794 5.249574

map을 사용하면 각기 다른 시나리오로 함수를 실행할 수 있다.

test=list(c(n=1,mean=1,sd=1),c(n=2,mean=2,sd=2),c(n=5,mean=0,sd=1))
map(test,~rnorm(.x[1],.x[2],.x[3]))
[[1]]
[1] 1.342506

[[2]]
[1] 3.065687 1.527249

[[3]]
[1] -0.2781750 -2.4036484  1.4374035 -0.2878402  0.3665915

조건 mapping

함수 map_if를 사용하는 방법을 살펴보자.

head(iris)

붓꽃 데이터에서 factor로 되어 있는 데이터만 character로 변경하고 싶다. 위 결과를 보면 Species의 데이터가 즉 factor임을 알 수 있다.

test <- map_if(iris,is.factor,as.character) %>% as_tibble()
test

결과를 보면 Species가 즉, character로 바뀌었다.

map이나 map_if는 기본적으로 list를 반환한다. 따라서 데이터를 검사하거나 각가의 데이터를 다르게 처리할 때 활용하기 좋다.

LS0tDQp0aXRsZTogInB1cnJyIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiMgdGlkeXZlcnNlDQoNCuustOyXh+uztOuLpOuPhCB0aWR5dmVyc2Xrpbwg66i87KCAIOu2iOufrOyZgOyVvO2VnOuLpC4NCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQojIE1hcO2VqOyImOydmCDquLDrs7gNCnB1cnJyOjptYXAoKeydgCDtlajsiJjsl5Ag7YyM652866+47YSw66W8IOuwmOuzteyggeyaqe2VmOq4sCDsnITtlbQg7IKs7Jqp65Cc64ukLiDsmIjrpbwg65Ok7Ja0LCBybm9ybShuPTIsbWVhbj0xKSwgcm5vcm0obj0yLG1lYW49MiksIHJub3JtKG49MixtZWFuPTMpLi4uIOuTseydhCDsspjrpqztlZjripQg6rK97Jqw66W8IOyDneqwge2VtOuztOyekC4gZm9yKCnrpbwg7JOw7KeAIOyViuqzoCBtYXDsnYQg7JOw66m0IOuLpOydjOqzvCDqsJnsnbQg6rCE64uo7ZWY6rKMIOyymOumrO2VoCDsiJgg7J6I64ukLiDqsrDqs7zqsJLsnYAgbGlzdOydtOuLpC4NCmBgYHtyfQ0KbWFwKDE6NSxybm9ybSxuPTIpDQpgYGANCg0K7J207KCcIOychOydmCDqsrDqs7zqsJLsnYQg67Cb7JWEKGxpc3Qg7ZiV7YOcKSDtj4nqt6DsnYQg6rOE7IKw7ZW067O07J6QLiDqsIHqsIHsnZggbGlzdOyXkCDrjIDtlbQg7ZWo7IiY66W8IOyggeyaqe2VmOqzoCDrsqHthLDroZwg6rKw6rO866W8IOuwlOq+uOugpOuptCBtYXBfZGJsKCnsnYQg7IKs7Jqp7ZWc64ukLg0KDQpgYGB7cn0NCm1hcCgxOjUscm5vcm0sbj0yKSAlPiUgbWFwX2RibChtZWFuKQ0KYGBgDQoNCuyemCDrkJjsl4jripTsp4Ag7ZmV7J247ZWY6riwIOychO2VtCDsiKvsnpDrpbwg7KKAIOuNlCDtgqTsm4zrs7TsnpAuDQpgYGB7cn0NCm1hcCgxOjUscm5vcm0sbj0xMDAwMCkgJT4lIG1hcF9kYmwobWVhbikgJT4lIHJvdW5kKCkNCmBgYA0KDQrtj4nqt6DsnbQg6rCB6rCBIDEsLi4sNeq5jOyngCDsnpgg64KY7JmU64ukLg0KDQrtkZztmITsl5Ag67aI66eM7J20IOyeiOuLpOuptCDsooDrjZQg66qF7Iuc7KCB7Jy866GcIOyymOumrO2VoCDsiJjrj4Qg7J6I64ukLg0KDQpgYGB7cn0NCm1hcCgxOjUsZnVuY3Rpb24oeCl7cm5vcm0obj0xMDAwMCx4KX0pICU+JSBtYXBfZGJsKG1lYW4pICU+JSByb3VuZCgpDQpgYGANCg0K7JWe7J2YIOumrOyKpO2KuCDrgrQg7JuQ7IaMIOqwgeqwgeydhCB466GcIOuwm+yVhCDtlajsiJjsspjrpqztlZjsmIDri6QuDQoNCngxPTEwLHgyPTXrnbzripQg642w7J207YSw7JeQIOqwgeqwgSAxMOydhCDrjZTtlZjqsbDrgpggMTDsnYQg6rOx7ZWY64qUIOusuOygnOulvCDsspjrpqztlbTrs7TsnpAuIOydtCDrlYwg7JuQ656YIOyeheugpe2WiOuNmCDrpqzsiqTtirjsnZgg7J2066aE7J2EIOq3uOuMgOuhnCDsgqzsmqntlaAg7IiYIOyeiOuLpC4NCg0KYGBge3J9DQpsaXN0KHgxPTEwLHgyPTUpICU+JSBtYXAoYCtgLDEwKQ0KYGBgDQoNCu2YueydgA0KYGBge3J9DQpsaXN0KHgxPTEwLHgyPTUpICU+JSBtYXBfZGJsKGArYCwxMCkNCmBgYA0KDQrqs7HtlZjquLAg66y47KCc64+EIOuniOywrOqwgOyngOuLpC4NCg0KYGBge3J9DQpsaXN0KHgxPTEwLHgyPTUpICU+JSBtYXBfZGJsKGAqYCwxMCkNCmBgYA0KDQptYXDsl5DshJwg7J6F66ClIOuyoe2EsOuKlCAueOuhnCDsnbTrpbwg7LKY66as7ZWY64qUIO2VqOyImOuKlCAuZuudvOqzoCDtlZzri6QuIOydtOygnCAueOulvCDtj6zrrqzrn6wg7Iud7J2EIO2ZnOyaqe2VmOyXrCDtkZztmITtlZjsnpAuDQoNCmBgYHtyfQ0KbWFwKDE6NSx+cm5vcm0obj00LC54KSkNCmBgYA0KDQptYXDsnYQg7IKs7Jqp7ZWY66m0IOqwgeq4sCDri6Trpbgg7Iuc64KY66as7Jik66GcIO2VqOyImOulvCDsi6TtlontlaAg7IiYIOyeiOuLpC4NCg0KYGBge3J9DQp0ZXN0PWxpc3QoYyhuPTEsbWVhbj0xLHNkPTEpLGMobj0yLG1lYW49MixzZD0yKSxjKG49NSxtZWFuPTAsc2Q9MSkpDQptYXAodGVzdCx+cm5vcm0oLnhbMV0sLnhbMl0sLnhbM10pKQ0KYGBgDQoNCiMg7KGw6rG0IG1hcHBpbmcNCg0K7ZWo7IiYIG1hcF9pZuulvCDsgqzsmqntlZjripQg67Cp67KV7J2EIOyCtO2OtOuztOyekC4NCg0KYGBge3J9DQpoZWFkKGlyaXMpDQpgYGANCg0K67aT6r2DIOuNsOydtO2EsOyXkOyEnCBmYWN0b3LroZwg65CY7Ja0IOyeiOuKlCDrjbDsnbTthLDrp4wgY2hhcmFjdGVy66GcIOuzgOqyve2VmOqzoCDsi7bri6QuIOychCDqsrDqs7zrpbwg67O066m0IFNwZWNpZXPsnZgg642w7J207YSw6rCAIDxmY3RyPiDspokgZmFjdG9y7J6E7J2EIOyVjCDsiJgg7J6I64ukLg0KDQpgYGB7cn0NCnRlc3QgPC0gbWFwX2lmKGlyaXMsaXMuZmFjdG9yLGFzLmNoYXJhY3RlcikgJT4lIGFzX3RpYmJsZSgpDQp0ZXN0DQpgYGANCg0K6rKw6rO866W8IOuztOuptCBTcGVjaWVz6rCAIDxjaHI+IOymiSwgY2hhcmFjdGVy66GcIOuwlOuAjOyXiOuLpC4NCg0KbWFw7J2064KYIG1hcF9pZuuKlCDquLDrs7jsoIHsnLzroZwgbGlzdOulvCDrsJjtmZjtlZzri6QuIOuUsOudvOyEnCDrjbDsnbTthLDrpbwg6rKA7IKs7ZWY6rGw64KYIOqwgeqwgOydmCDrjbDsnbTthLDrpbwg64uk66W06rKMIOyymOumrO2VoCDrlYwg7Zmc7Jqp7ZWY6riwIOyii+uLpC4NCg==

댓글

이 블로그의 인기 게시물

R에서 csv 파일 읽는 법

xlwings tutorial - 데이터 계산하여 붙여 넣기