Преобразование названного вектора в 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"))