Преобразуйте именованный вектор в data.frame R - PullRequest
2 голосов
/ 07 мая 2020

Мне было интересно, как я могу достичь желаемого output ниже в BASE R?

input <- c(a_1 = 2, a_2 = 3, b_1 = 1, b_2 = 0)

output <- data.frame(a = 2:3, b = 1:0)

Ответы [ 2 ]

5 голосов
/ 07 мая 2020

Мы можем split на основе подстроки names из 'input' и преобразовать в data.frame

data.frame(split(unname(input), sub("_\\d+$", "", names(input))))
#  a b
#1 2 1
#2 3 0

Или используя unstack

nm1 <- sub('_\\d+$', '', names(input))
unstack(input ~ nm1, data.frame(input, nm1))

Или другой вариант - конструкция matrix, если 'a', 'b' имеют одинаковую длину

matrix(input, ncol = 2,  dimnames = list(NULL, 
        unique(substring(names(input), 1, 1))))
1 голос
/ 07 мая 2020

reshape также может позаботиться об этом автоматически, если вы сделаете свой вектор data.frame. Он также разделит часть _x на переменную time в выходных данных, если имена переменных всегда находятся в шаблоне name_x.

reshape(data.frame(t(input)), varying=TRUE, sep="_", direction="long")
#    time a b id
#1.1    1 2 1  1
#1.2    2 3 0  1
...