2016-10-14 22 views
5

tidyverse का उपयोग करने के लिए पसंदीदा तरीका है, अक्सर मुझे वेक्टर के नाम होने वाले कॉलम के साथ data.frame/tibble में नामित वैक्टर बदलने की चुनौती का सामना करना पड़ता है।
ऐसा करने का पसंदीदा/tidyversey तरीका क्या है?
संपादित करें: इस से संबंधित है: this और this GitHub मुद्दाtidyverse - एक नामित वेक्टर को डेटा.फ्रेम/टिबल

तो मैं चाहता हूँ:

require(tidyverse) 
vec <- c("a" = 1, "b" = 2) 

इस बनने के लिए:

# A tibble: 1 × 2 
     a  b 
    <dbl> <dbl> 
1  1  2 

मैं क्या कर सकते हैं इस के माध्यम से उदाहरण के लिए:

vec %>% enframe %>% spread(name, value) 
vec %>% t %>% as_tibble 

USECASE उदाहरण:

require(tidyverse) 
require(rvest) 
txt <- c('<node a="1" b="2"></node>', 
     '<node a="1" c="3"></node>') 

txt %>% map(read_xml) %>% map(xml_attrs) %>% map_df(~t(.) %>% as_tibble) 

कौन सा

# A tibble: 2 × 3 
     a  b  c 
    <chr> <chr> <chr> 
1  1  2 <NA> 
2  1 <NA>  3 
+0

वास्तव में क्या है, अगर कुछ भी, आपको लगता है कि आप क्या कर रहे हैं के बारे में कमी है है – shayaa

+2

मैं अपने आप से पूछा वही, क्योंकि 'bind_rows'' map_df (~ t (।)%>% as_tibble के बजाय काम नहीं करता है)। तो, अब तक, मैं ट्रांसफर करता हूं, स्ट्रिंग्स वाले चरित्रों (कारकों पर नहीं) वाले डेटा फ्रेम में कनवर्ट करता हूं, और फिर परिणामों को एक साथ जोड़ता हूं। हालांकि, इस सामान्य कार्य के लिए एक शॉर्टकट अच्छा हो सकता है। – lukeA

+1

@lukeA, मुझे लगता है कि 'bind_rows' को अब अपडेट करने के तरीके में अपडेट किया गया है – markdly

उत्तर

2

यह अब सीधे bind_rows का उपयोग कर समर्थित है (dplyr 0.7.0 में शुरू की गई):

bind_rows() और bind_cols() अब वैक्टर स्वीकार करते हैं:

library(tidyverse)) 
vec <- c("a" = 1, "b" = 2) 

bind_rows(vec) 
#> # A tibble: 1 x 2 
#>  a  b 
#> <dbl> <dbl> 
#> 1  1  2 

https://cran.r-project.org/web/packages/dplyr/news.html से यह बोली परिवर्तन बताते हैं । उन्हें बाद में पूर्व और कॉलम द्वारा पंक्तियों के रूप में माना जाता है। पंक्तियों को c(col1 = 1, col2 = 2) जैसे आंतरिक नामों की आवश्यकता होती है, जबकि स्तंभों को बाहरी नामों की आवश्यकता होती है: col1 = c(1, 2)। सूची को अभी भी डेटा फ्रेम के रूप में माना जाता है लेकिन इसे !!! के साथ स्पष्ट रूप से विभाजित किया जा सकता है, उदा। bind_rows(!!! x) (# 1676)।

इस बदलाव के साथ

, इसका मतलब है कि उपयोग के मामले उदाहरण में निम्न पंक्ति:

txt %>% map(read_xml) %>% map(xml_attrs) %>% map_df(~t(.) %>% as_tibble)

रूप

txt %>% map(read_xml) %>% map(xml_attrs) %>% map_df(bind_rows)

जो भी

के बराबर है फिर से लिखा जा सकता है

txt %>% map(read_xml) %>% map(xml_attrs) %>% { bind_rows(!!! .) }

अलग दृष्टिकोण की समतुल्यता निम्न उदाहरण में बताया गया है: (?)

library(tidyverse) 
library(rvest) 

txt <- c('<node a="1" b="2"></node>', 
     '<node a="1" c="3"></node>') 

temp <- txt %>% map(read_xml) %>% map(xml_attrs) 

# x, y, and z are identical 
x <- temp %>% map_df(~t(.) %>% as_tibble) 
y <- temp %>% map_df(bind_rows) 
z <- bind_rows(!!! temp) 

identical(x, y) 
#> [1] TRUE 
identical(y, z) 
#> [1] TRUE 

z 
#> # A tibble: 2 x 3 
#>  a  b  c 
#> <chr> <chr> <chr> 
#> 1  1  2 <NA> 
#> 2  1 <NA>  3 
0

देता है यह मेरे लिए काम करता है: c("a" = 1, "b" = 2) %>% t() %>% tbl_df()

0

दिलचस्प बात यह है कि आप as_tibble() विधि का उपयोग कर सकते हैं सूचियों एक कॉल में यह करने के लिए के लिए। ध्यान दें कि यह सबसे अच्छा अभ्यास नहीं है क्योंकि यह एक निर्यात विधि नहीं है।

tibble:::as_tibble.list(vec) 
संबंधित मुद्दे