2017-11-25 10 views
7

में एकाधिक ggplot प्लॉट करने के लिए purrr :: pmap का उपयोग कैसे करें nested.data.frame में ggplot के एकाधिक प्लॉट बनाने के लिए purrr :: pmap के बारे में मेरे कुछ प्रश्न हैं।nreded.data.frame

मैं purrr :: map2 का उपयोग करके बिना किसी समस्या के कोड चला सकता हूं और मैं nested.data.frame में मल्टीप्लॉट (2 प्लॉट) बना सकता हूं।

एक उदाहरण के रूप में, मैं, आर

library(tidyverse) 

iris0 <- iris 
iris0 <- 
iris0 %>% 
group_by(Species) %>% 
nest() %>% 
mutate(gg1 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Sepal.Width)) + geom_point())) %>% 
mutate(gg2 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Width)) + geom_point())) %>% 
mutate(g = purrr::map2(gg1, gg2, ~ gridExtra::grid.arrange(.x, .y))) 

में आईरिस डाटासेट में प्रयोग किया जाता लेकिन जब मैं अधिक से अधिक 2 भूखंडों प्लॉट करने के लिए चाहता हूँ, मुझे :: नीचे दिए गए कोड की तरह pmap purrr का उपयोग कर हल नहीं कर सकते हैं।

iris0 <- 
iris0 %>% 
group_by(Species) %>% 
nest() %>% 
mutate(gg1 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Sepal.Width)) + geom_point())) %>% 
mutate(gg2 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Width)) + geom_point())) %>% 
mutate(gg3 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Length)) + geom_point())) %>% 
mutate(g = purrr::pmap(gg1, gg2,gg3, ~ gridExtra::grid.arrange(.x, .y, .z))) 

> Error in mutate_impl(.data, dots) : Index 1 is not a length 1 vector 

क्या इस समस्या को nested.data.frame में हल करने का कोई तरीका है? कृपया मुझे कुछ सलाह या उत्तर दें।

उत्तर

8

purrr::pmap लेता है (कम से कम) दो तर्क:

pmap(.l, .f, ...) 

जहां

.l: A list of lists. The length of '.l' determines the number of 
     arguments that '.f' will be called with. List names will be 
     used if present. 
    .f: A function, formula, or atomic vector. 

इसके अलावा, .x और .y केवल दो तर्क के लिए अच्छी तरह से काम करते हैं, लेकिन (एक ही आदमी पेज में) यह कहता है For more arguments, use '..1', '..2', '..3' etc

पठनीयता (और थोड़ी दक्षता) के लिए, मैं सभी व्यक्तिगत कॉल को mutate पर एक साथ जोड़ दूंगा; यदि आवश्यक हो तो आप उन्हें अलग रख सकते हैं (यदि इस कम उदाहरण में आपके द्वारा दिखाए गए कोड से अधिक है तो एएसपी):

library(dplyr) 
library(tidyr) 
library(purrr) 
library(ggplot2) 
iris0 <- iris %>% 
    group_by(Species) %>% 
    nest() %>% 
    mutate(
    gg1 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Sepal.Width)) + geom_point()), 
    gg2 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Width)) + geom_point()), 
    gg3 = purrr::map(data, ~ ggplot(., aes(Sepal.Length, Petal.Length)) + geom_point()), 
    g = purrr::pmap(list(gg1, gg2, gg3), ~ gridExtra::grid.arrange(..1, ..2, ..3)) 
) 
+0

त्वरित उत्तरों के लिए धन्यवाद! मैं अपनी समस्या का समाधान कर सकता हूँ! मैंने purrr को देखा है :: pmap सूचियों की सूची की जरूरत है। धन्यवाद। –

+1

यदि यह आपकी समस्या का समाधान करता है, तो कृपया उत्तर के बाईं ओर स्थित चेकमार्क का चयन करके इसे "स्वीकार करें"। – r2evans