2016-06-10 2 views
1

Если у меня есть data.frameв R: Two Way Соответств Матрица

df <- data.frame(DEP=letters[1:5], ARR=letters[11:15], NO=1:5+5) 

    DEP ARR NO 
1 a k 6 
2 b l 7 
3 c m 8 
4 d n 9 
5 e o 10 

Я хочу, чтобы создать матрицу DEP как ROW ID, и ARR, как COL ID и заполнить матрицу с соответствующие соответствия NO ...

eg

k l m n o 
a 6 7 8 9 10 ...etc 

Каждая комбинация уникальна.

DEP и ARR - это один и тот же вектор имен. Для ясности я выбрал два разных образца.

Я изо всех сил использовать спичку, чтобы отсортировать их и заполнить их в шаблон матрицы я создал ниже:

mat <- matrix(0,nrow(df),nrow(df)); colnames(mat) <- df$ARR; rownames(mat) <- df$DEP; 

    k l m n o 
a 0 0 0 0 0 
b 0 0 0 0 0 
c 0 0 0 0 0 
d 0 0 0 0 0 
e 0 0 0 0 0 

Есть ли эффективный способ сделать это? Большое спасибо за все советы!

ответ

5

?xtabs:

xtabs(NO ~ ., data=df) 
# ARR 
#DEP k l m n o 
# a 6 0 0 0 0 
# b 0 7 0 0 0 
# c 0 0 8 0 0 
# d 0 0 0 9 0 
# e 0 0 0 0 10 
+0

спасибо! Я даже не слышал о xtabs. –

3

Если я правильно понял ваш вопрос, вы можете использовать разреженное определение матрицы:

library(Matrix) 
mat <- spMatrix(length(df$DEP), length(df$ARR), 
       seq(df$DEP), seq(df$ARR), as.numeric(as.character(df$NO))) 
rownames(mat) <- df$DEP 
colnames(mat) <- df$ARR 
#> as.matrix(mat) 
# k l m n o 
#a 6 0 0 0 0 
#b 0 7 0 0 0 
#c 0 0 8 0 0 
#d 0 0 0 9 0 
#e 0 0 0 0 10 
+1

Это вполне может сделать больше смысла использовать разреженную матрицу, если будет много '0''s – thelatemail

+0

Большое спасибо! Попытка разреженной матрицы. У меня есть ошибка: недопустимый объект класса «dgTMatrix»: все индексы столбцов (слот «j») должны быть от 0 до ncol-1 в TsparseMatrix. Попытка разобраться. –

+0

Класс является фактором. Я попытался преобразовать его с той же ошибкой. Что вы порекомендуете? –