แปลง Nameed Character Vector เป็น data.frame


87

ฉันมีเวกเตอร์อักขระที่มีชื่อที่ส่งคืนจาก xmlAttrs ดังนี้:

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

ฉันต้องการแปลงเป็น data frame ที่มีลักษณะดังนี้:

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

คำตอบ:


86

data.frame(as.list(testVect))มันเป็นธรรมดาที่ data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE)หรือถ้าคุณต้องการชนิดข้อมูลที่เหมาะสมสำหรับคอลัมน์ของคุณ


1
ผิดปกติอะนาล็อกtibbleของสิ่งนี้ไม่ทำงาน: data_frame(as.list(testVect))ส่งคืน data frame 5 แถว
CoderGuy123

5
@Deleet tibbleจะทำงานร่วมกับas_tibble(as.list(testVect))หรือas_data_frame(as.list(testVect))( as_data_frameเป็นนามแฝงสำหรับas_tibble)
JWilliman

2
สอดคล้องกับความคิดเห็นของ @Deleet และ @JWillliman data.table(as.list(...))ไม่ได้ผล แต่as.data.table(as.list(...))ทำแทน
merv

@Matthew Plourde ไม่ว่าจะเป็น stringsAsFactors True หรือ False ก็ให้ข้อมูลประเภทเดียวกัน จะไม่เปลี่ยนชนิดข้อมูลได้อย่างไร?
AMS

57

คำตอบจาก @MatthewPlourde และ @JackRyan ทำงานได้ แต่ถ้าคุณมีเวกเตอร์ชื่อยาวมันน่ารำคาญที่จะมี data frame ที่มีแถวเดียวและหลายคอลัมน์ หากคุณต้องการมีคอลัมน์ "คีย์" และคอลัมน์ "ค่า" ที่มีหลายแถวสิ่งต่อไปนี้ควรใช้งานได้:

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Čuklina

5
ยังสามารถใช้tibble::enframe(testVect).
JWilliman

2
stack(testVect)ยังทำเช่นนี้ แต่ปล่อยให้ค่าเป็นอักขระ
โจ

@ Jelena-bioinf เป็นหนึ่งซับที่มีไวยากรณ์ dplyr คุณสามารถใช้testVect %>% as.list %>% as.data.frame %>% tidyr::gather()สิ่งนี้สร้างคอลัมน์ 'คีย์' และ 'ค่า' ซึ่ง @dnlbrky อ้างถึง
Agile Bean

stack()ช่างเป็นฟังก์ชันที่ประเมินค่าไม่ได้!
stevec


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 โดยแพ็คเกจ reprex (v0.3.0)

ดังที่แสดงในtidyverse - วิธีที่ดีกว่าในการเปลี่ยนเวกเตอร์ที่มีชื่อเป็น data.frame / tibble


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

โปรดเพิ่มคำอธิบายที่นี่เพื่อให้ทุกคนได้เรียนรู้ ณ ตอนนี้หนึ่งซับค่อนข้างตื้น
harmonica141
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.