Reputation: 13852
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
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
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
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