Chuyển đổi Vectơ ký tự được đặt tên thành data.frame


86

Tôi có một vectơ ký tự được đặt tên được trả về từ xmlAttrs như thế này:

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

Tôi muốn chuyển đổi nó thành một khung dữ liệu giống như sau:

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

Câu trả lời:


84

Nó đơn giản như data.frame(as.list(testVect)). Hoặc nếu bạn muốn các kiểu dữ liệu hợp lý cho các cột của mình data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE),.


1
Kỳ quặc, các tibble analog của điều này không làm việc: data_frame(as.list(testVect))trả về một khung dữ liệu 5 liên tiếp.
CoderGuy123

5
@Deleet tibble sẽ hoạt động với as_tibble(as.list(testVect))hoặc as_data_frame(as.list(testVect))( as_data_framelà một bí danh cho as_tibble).
JWilliman

2
Phù hợp với nhận xét của @Deleet và @JWillliman, data.table(as.list(...))không hoạt động, nhưng thay vào đó as.data.table(as.list(...))thì có.
merv

@Matthew Plourde Cho dù stringAsFactors Đúng hay Sai, nó đều cung cấp cùng một kiểu dữ liệu. Làm thế nào để không thay đổi kiểu dữ liệu?
AMS

56

Câu trả lời từ @MatthewPlourde và @JackRyan hoạt động, nhưng nếu bạn có một vectơ được đặt tên dài, thật khó chịu khi có một khung dữ liệu với một hàng và nhiều cột. Nếu bạn muốn có cột "khóa" và cột "giá trị" có nhiều hàng, thì bất kỳ điều nào sau đây sẽ hoạt động:

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

buồn rằng không có một liner
JelenaČuklina

5
Cũng có thể sử dụng tibble::enframe(testVect).
JWilliman

2
stack(testVect)cũng làm điều này nhưng để lại các giá trị dưới dạng ký tự.
Joe

@ Jelena-bioinf dưới dạng một lớp lót với cú pháp dplyr, bạn có thể sử dụng testVect %>% as.list %>% as.data.frame %>% tidyr::gather()Điều này thực sự tạo ra các cột 'khóa' và 'giá trị' mà @dnlbrky đề cập đến.
Agile Bean

stack(), thật là một chức năng bị đánh giá thấp!
stevec

18

Tôi sẽ cố gắng thực hiện điều này:

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

Hoặc ngắn hơn, đơn giảndata.frame(t(testVect))
Tjebo

3

Tôi sử dụng để sử dụng các chức năng gợi ý trong các câu trả lời ( as.list, as_tibble, t, enframe, vv) nhưng có kể từ khi phát hiện ra rằng dplyr::bind_rowshiện đang làm việc để thực hiện chính xác những gì các câu hỏi ban đầu yêu cầu với một cuộc gọi chức năng duy nhất.

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

Được tạo vào ngày 11 tháng 10 năm 2019 bởi gói reprex (v0.3.0)

Như được hiển thị trong ngăn nắp - cách ưa thích để biến một vectơ đã đặt tên thành một data.frame / tibble


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

Vui lòng thêm một số giải thích xung quanh đây để mọi người có thể học hỏi. Như bây giờ một lớp lót là một chút nông.
harmonica141
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.