luciano
luciano

Reputation: 13852

Convert named vector to dataframe

I have this named vector:

x <-  1:5

names(x) <- c('0 15', '1 15', '2 15', '0 16', '1 16')

What is the best way to convert x to this dataframe:

xDF <- data.frame(V1 = c(0, 1, 2, 0, 1), V2 = c(15, 15, 15, 16, 16), V3 = 1:5)

Upvotes: 15

Views: 41579

Answers (3)

Richard Telford
Richard Telford

Reputation: 9933

Here is a tidyverse solution using enframe and then separate

library(tidyverse)
enframe(x, name = "v12", value = "v3") %>% 
  separate(v12, into = c("v1", "v2"))

Upvotes: 0

A5C1D2H2I1M1N2O1R2T1
A5C1D2H2I1M1N2O1R2T1

Reputation: 193687

Here's a very direct approach:

cbind(read.table(text = names(x)), x)
     V1 V2 x
0 15  0 15 1
1 15  1 15 2
2 15  2 15 3
0 16  0 16 4
1 16  1 16 5

In this case, read.table will automatically take care of splitting your names(x) component (by default, by space, but other characters could be specified if necessary).

You can also set the name for x directly in cbind:

cbind(read.table(text = names(x)), V3 = x)

A more direct approach would be to use cSplit from my "splitstackshape" package, like this:

library(splitstackshape)
cSplit(stack(x), "ind", " ")

Upvotes: 16

Paul Hiemstra
Paul Hiemstra

Reputation: 60984

I'd do something like this:

res = data.frame(cbind(do.call('rbind', strsplit(names(x), " ")), x))
res
     V1 V2 x
0 15  0 15 1
1 15  1 15 2
2 15  2 15 3
0 16  0 16 4
1 16  1 16 5

Do mind that the data types are not correct yet, the first two columns are factor's.

Upvotes: 5

Related Questions