2016-07-14 2 views
2

У меня есть 3 векторов в следующем:R - Создать матрицу из 3 сырого вектора

A <- c("A", "B", "C", "D", "E") 
B <- c("1/1/1", "1/1/1", "2/1/1", "2/1/1", "3/1/1") 
C <- c(1, 1, -1, 1, -1) 

, и я хочу, чтобы создать матрицу, как следующее, используя 3 векторов:

- 1/1/1 2/1/1 3/1/1 
A 1 0  0 
B 1 0  0 
C 0 -1 0 
D 0 1  0 
E 0 0  -1 

где вектор A и B - это строки и столбцы соответственно, и у меня есть данные как C. Любая помощь будет оценена по достоинству.

+0

Очень близко к дубликата HTTP: // stackoverflow.com/questions/37739840/in-r-two-way-match-to-mat rix/37739993 – thelatemail

ответ

5

Вы можете попробовать:

`[<-`(array(0,c(length(unique(A)),length(unique(B))), 
     list(unique(A),unique(B))), 
     cbind(A,B),C) 
# 1/1/1 2/1/1 3/1/1 
#A  1  0  0 
#B  1  0  0 
#C  0 -1  0 
#D  0  1  0 
#E  0  0 -1 
+0

Можете ли вы вкратце объяснить, как работает код? –

+2

Вы можете думать о '' [<- '(A, cbind (i, j), C) 'как' A [cbind (i, j)] <- C' – kitman0804

6

Использование ?xtabs

xtabs(C ~ A+B) 
# B 
#A 1/1/1 2/1/1 3/1/1 
# A  1  0  0 
# B  1  0  0 
# C  0 -1  0 
# D  0  1  0 
# E  0  0 -1 
+2

Это бум. –

2

Другой вариант acast из reshape2 после создания data.frame

library(reshape2) 
acast(data.frame(A, B, C), A~B, value.var = "C", fill =0) 
# 1/1/1 2/1/1 3/1/1 
#A  1  0  0 
#B  1  0  0 
#C  0 -1  0 
#D  0  1  0 
#E  0  0 -1 
Смежные вопросы