Преобразование названного вектора в dataframe

У меня есть этот вектор:

x <-  1:5

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

Каков наилучший способ преобразования x в этот фреймворк данных:

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

Ответ 1

Здесь очень прямой подход:

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

В этом случае read.table автоматически позаботится о разделении вашего компонента names(x) (по умолчанию, по пробелу, но при необходимости могут быть указаны другие символы).

Вы также можете установить имя для x непосредственно в cbind:

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

Более прямым подходом было бы использовать cSplit из моего пакета splitstackshape, например:

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

Ответ 2

Я бы сделал что-то вроде этого:

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

Учтите, что типы данных еще не верны, первые два столбца - factor.

Ответ 3

Вот решение tidyverse с использованием enframe, а затем separate

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