İsimli Karakter Vektörünü data.frame'e dönüştürme


87

XmlAttrs'den şöyle döndürülen adlandırılmış bir karakter vektörüm var:

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

Bunu şuna benzeyen bir veri çerçevesine dönüştürmek istiyorum:

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

Yanıtlar:


86

Bu kadar basit data.frame(as.list(testVect)). Veya sütunlarınız için mantıklı veri türleri istiyorsanız data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE).


1
Garip bir şekilde, bunun tibble analogu çalışmıyor: data_frame(as.list(testVect))5 satırlık bir veri çerçevesi döndür.
CoderGuy123

5
@Deleet Tibble ile irade çalışma as_tibble(as.list(testVect))ya da as_data_frame(as.list(testVect))( as_data_framebir takma içindir as_tibble).
JWilliman

2
@Deleet ve @JWillliman'ın yorumları doğrultusunda data.table(as.list(...))işe yaramıyor, aksine çalışıyor as.data.table(as.list(...)).
merv

@Matthew Plourde stringsAsFactors True veya False olsun, aynı veri türünü verir. Veri türü nasıl değiştirilmez?
AMS

57

@ MatthewPlourde ve @JackRyan'dan gelen cevaplar işe yarıyor, ancak uzun bir isimlendirilmiş vektörünüz varsa, tek satırlı ve çok sayıda sütunlu bir veri çerçevesine sahip olmak can sıkıcı. Bir "anahtar" sütununa ve çok sayıda satır içeren bir "değer" sütununa sahip olmayı tercih ederseniz, aşağıdakilerden herhangi biri çalışmalıdır:

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

tek astarlı olmaması üzücü
JelenaČuklina

5
Ayrıca kullanabilir tibble::enframe(testVect).
JWilliman

2
stack(testVect)bunu da yapar ancak değerleri karakter olarak bırakır.
Joe

@ Jelena-bioinf, dplyr sözdizimi ile tek satırlık olarak kullanabilirsiniz. testVect %>% as.list %>% as.data.frame %>% tidyr::gather()Bu , @dnlbrky'nin bahsettiği 'anahtar' ve 'değer' sütunlarını üretir.
Çevik Bean

stack(), ne küçümsenmiş bir işlev!
stevec

18

Şuna bir bıçak atacağım:

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

Ya da daha kısa, basitçedata.frame(t(testVect))
tjebo

3

Ben bu cevaplar önerilen fonksiyonlar (kullanırdık as.list, as_tibble, t, enframe, vb) ama öğrendim beri var dplyr::bind_rowsşimdi özgün soru tek bir işlev çağrısı ile sorar tam olarak ne yapmak için çalışır.

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 tarihinde reprex paketi tarafından oluşturuldu (v0.3.0)

Tidyverse'te gösterildiği gibi - adlandırılmış bir vektörü bir veriye dönüştürmek için tercih edilen bir yol . Çerçeve / tibble


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

Lütfen buraya biraz açıklama ekleyin, böylece herkes öğrenebilir. Şu an itibariyle tek astar biraz sığ.
harmonica141
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.