명명 된 문자형 벡터를 data.frame으로 변환


87

다음과 같이 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

답변:


86

그것은 간단합니다 data.frame(as.list(testVect)). 또는 열에 대해 합리적인 데이터 유형을 원하는 경우 data.frame(lapply(testVect, type.convert), stringsAsFactors=FALSE).


1
이상하게도 이것 의 tibble 아날로그는 작동하지 않습니다 data_frame(as.list(testVect)). 5 행 데이터 프레임을 반환합니다.
CoderGuy123

5
@Deleet tibbleas_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 참이든 거짓이든, 동일한 데이터 유형을 제공합니다. 데이터 유형을 변경하지 않는 방법은 무엇입니까?
AMS

57

@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)또한이 작업을 수행하지만 값은 문자로 남겨 둡니다.
Joe

@ 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

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

reprex 패키지 (v0.3.0)에 의해 2019-11-10에 생성됨

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.