Превращение вектора в матрицу - PullRequest
1 голос
/ 22 марта 2019

У меня есть следующий вектор из 5 значений, содержащий следующие месяцы:

[July August September October November]

Как получить их в виде матрицы следующим образом.

[July August September October November]
[1,    0,       0,       0,       0    ]
[0,    1,       0,       0,       0    ]
[0,    0,       1,       0,       0    ]
[0,    0,       0,       1,       0    ]
[0,    0,       0,       0,       1    ]

Дополнительно Iесть еще один вектор, который я хотел бы добавить в конец, чтобы вывод выглядел следующим образом.

[July August September October November Other]
[1,    0,       0,       0,       0,      50 ]
[1,    0,       0,       0,       0,      30 ]
[1,    0,       0,       0,       0,      60 ]
[1,    0,       0,       0,       0,      22 ]
[1,    0,       0,       0,       0,      5  ]

Ответы [ 3 ]

1 голос
/ 22 марта 2019
sapply(v1, function(x) as.numeric(v1 == x))
#     July August September October November
#[1,]    1      0         0       0        0
#[2,]    0      1         0       0        0
#[3,]    0      0         1       0        0
#[4,]    0      0         0       1        0
#[5,]    0      0         0       0        1
1 голос
/ 22 марта 2019

Мы можем использовать table с последовательностью вектора и самого вектора. Если необходимо сохранить порядок названий месяцев, преобразуйте его в factor с levels, указанным intersect из unique элементов вектора и month.name

tbl <- table(seq_along(v1), v2, dnn = NULL)
tbl
#   July August September October November
#1    1      0         0       0        0
#2    0      1         0       0        0
#3    0      0         1       0        0
#4    0      0         0       1        0
#5    0      0         0       0        1

Теперь мы можем добавить второй vector

cbind(tbl, Other)

Или используя model.matrix

model.matrix(~ v2 - 1, data = data.frame(v2))

Или используя mtabulate из qdapTools

library(qdapTools)
mtabulate(v2)

данные

v1 <- c("July", "August", "September", "October", "November")
v2 <- factor(v1, levels = intersect(month.name, unique(v1)))
0 голосов
/ 22 марта 2019

Вы можете использовать model.matrix или dummyVars также

Данные:

v1 <- c("July", "August", "September", "October", "November")
v1 <- as.data.frame(v1)

Model.Matrix:

v2 <- data.frame(v1 = v1)
as.data.frame(model.matrix(~.-1, v1))
  v1August v1July v1November v1October v1September
1        0      1          0         0           0
2        1      0          0         0           0
3        0      0          0         0           1
4        0      0          0         1           0
5        0      0          1         0           0

DummyVars подход:

library(caret)
m1 <- dummyVars(" ~ .", data = v1)
data.frame(predict(m1, newdata = v1))
  v1.August v1.July v1.November v1.October v1.September
1         0       1           0          0            0
2         1       0           0          0            0
3         0       0           0          0            1
4         0       0           0          1            0
5         0       0           1          0            0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...