नामांकित वर्ण वेक्टर को data.frame में कनवर्ट करें


86

मेरे पास एक नामित वर्ण वेक्टर है जो इस तरह से xmlAttrs से लौटा है:

testVect <- structure(c("11.2.0.3.0", "12.89", "12.71"), .Names = c("db_version", 
             "elapsed_time", "cpu_time"))

मैं इसे एक डेटा फ्रेम में बदलना चाहता हूं जो इस तरह दिखता है:

testDF <- data.frame("db_version"="11.2.0.3.0","elapsed_time"=12.89,"cpu_time"=12.71)
head(testDF)
  db_version elapsed_time cpu_time
1 11.2.0.3.0        12.89    12.71

जवाबों:


84

यह उतना ही सरल है data.frame(as.list(testVect))। या यदि आप अपने कॉलम के लिए समझदार डेटा प्रकार चाहते हैं, data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE)


1
अजीब तरह से, इस का तिहरा एनालॉग काम नहीं करता है: data_frame(as.list(testVect))5 पंक्ति डेटा फ़्रेम लौटाएं।
कोडरगुइज़

5
@ डेली टिबबल ( as_tibble(as.list(testVect))या के लिए एक उपनाम ) के साथ काम करेगा । as_data_frame(as.list(testVect))as_data_frameas_tibble
JWilliman

2
@Deleet और @Jillillan द्वारा टिप्पणियों के अनुरूप, data.table(as.list(...))काम नहीं करता, बल्कि as.data.table(as.list(...))करता है।
20

@ मैथ्यू प्लॉर्ड चाहे स्ट्रिंग्सएफ़ैक्टर्स सही है या गलत, यह एक ही डेटा प्रकार देता है। डेटा प्रकार कैसे न बदलें?
एम्स

56

@MatthewPlourde और @JackRyan से जवाब काम करते हैं, लेकिन अगर आपके पास एक लंबे नाम वाला वेक्टर है, तो एक पंक्ति और कई स्तंभों के साथ डेटा फ़्रेम होना कष्टप्रद है। यदि आपके पास "कुंजी" कॉलम और कई पंक्तियों के साथ "मान" कॉलम है, तो निम्न में से कोई भी काम करना चाहिए:

data.frame(keyName=names(testVect), value=testVect, row.names=NULL)

##        keyName      value
## 1   db_version 11.2.0.3.0
## 2 elapsed_time      12.89
## 3     cpu_time      12.71


## Suggested by @JWilliman
tibble::enframe(testVect)

## # A tibble: 3 x 2
##   name         value
##   <chr>        <chr>
## 1 db_version   11.2.0.3.0
## 2 elapsed_time 12.89
## 3 cpu_time     12.71


## Suggested by @Joe
stack(testVect)
##       values          ind
## 1 11.2.0.3.0   db_version
## 2      12.89 elapsed_time
## 3      12.71     cpu_time

दुख की बात है कि वहाँ कोई एक लाइनर है
Jelena there'suklina

5
का भी उपयोग कर सकते हैं tibble::enframe(testVect)
जॉलीमैन

2
stack(testVect)यह भी करता है लेकिन मूल्यों को पात्रों के रूप में छोड़ देता है।
जो

@ जेलेना- bioinf को डंपलर सिंटैक्स के साथ वन-लाइनर के रूप में इस्तेमाल कर सकते हैं testVect %>% as.list %>% as.data.frame %>% tidyr::gather()
फुर्तीला बीन

stack(), क्या एक कम समारोह!
stevec

18

मैं इस पर एक छुरा लेने जा रहा हूँ:

test.vector <- as.data.frame(t(testVect))
class(test.vector)

या इससे भी छोटा, बसdata.frame(t(testVect))
TJbo

3

मैं कार्यों इन उत्तरों में सुझाव दिया (का उपयोग करते थे as.list, as_tibble, t, enframe, आदि) लेकिन जब से पता चला कि है dplyr::bind_rowsअब वास्तव में क्या मूल प्रश्न एक भी समारोह कॉल के साथ पूछता है क्या करने के लिए काम करता है।

library(dplyr)
testVect <- structure(c("11.2.0.3.0", "12.89", "12.71"), .Names = c("db_version", "elapsed_time", "cpu_time"))
testVect %>% bind_rows
#> # A tibble: 1 x 3
#>   db_version elapsed_time cpu_time
#>   <chr>      <chr>        <chr>   
#> 1 11.2.0.3.0 12.89        12.71

2019-11-10 को रेप्रेक्स पैकेज द्वारा बनाया गया (v0.3.0)

जैसा कि tidyverse में दिखाया गया है - किसी नामित वेक्टर को data.frame / tibble में बदलने का पसंदीदा तरीका


0
named vector %>% as_tibble(.,rownames="column name of row.names")

कृपया यहाँ कुछ स्पष्टीकरण जोड़ें ताकि हर कोई सीख सके। अब तक वन-लाइनर थोड़ा उथला है।
हारमोनिका 141
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.