Преобразование именованного вектора символов в 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
dnlbrky
источник
грустно, что нет однострочного
JelenaČuklina
5
Также можно использовать tibble::enframe(testVect).
JWilliman 02
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))
Tjebo 04
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 пакетом REPEX (v0.3.0)

Как показано в tidyverse - предпочтительный способ превратить именованный вектор в data.frame / tibble

Артур Йип
источник
0
named vector %>% as_tibble(.,rownames="column name of row.names")
БэтменФан
источник
Пожалуйста, добавьте здесь некоторые пояснения, чтобы все могли узнать. На данный момент однострочник немного мелковат.
гармоника141