Перетворити іменований символ символу на 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- рядковий кадр даних.
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

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

18

Я збираюся вдарити це:

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

Або навіть коротше, простоdata.frame(t(testVect))
Тебо

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

Створено 10.11.2019 пакетом reprex (v0.3.0)

Як показано в tidyverse - кращий спосіб перетворити названий вектор на data.frame / tibble


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

Будь ласка, додайте тут пояснення, щоб усі могли навчитися. На даний момент однокласник трохи неглибокий.
гармоніка141
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.