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==
댓글
댓글 쓰기