2015-09-02 7 views
3

У меня возникла проблема, которую я не понимаю. Это ответ на предложенные ответы here и hereОшибка при создании разреженной матрицы

У меня есть два одинаково структурированных набора данных. Один, который я создал как воспроизводимый пример, для которого работает код, и тот, который является реальным, для которого код не работает. Посмотрев на него часами, я не могу найти причину ошибки. Ниже приведен пример, который работает

df <- data.table(cbind(rep(seq(1,25), each = 4)), cbind(rep(seq(1,40), length.out = 100))) 
    colnames(df) <- c("a", "b") #ignore warning 
setkey(df, a, b) 

Это просто создать воспроизводимый пример. Когда я применить - немного скорректирован - код предложенного в указанных SO статей, которые я получаю то, что я ищу: разреженную матрицу, которая указует, когда два элемента в столбце Ь встречается вместе для значений столбца

library(Matrix) 
s <- sparseMatrix(
    df$a, 
    df$b, 
    dimnames = list(
     unique(df$a),unique(df$b)), x = 1) 
v <- t(s) %*% s 

Теперь я делаю - в моих глазах - точно так же на моем реальном наборе данных, который намного длиннее.

Образец dput ниже выглядит следующим образом

test <- dput(dk[1:50,]) 
structure(list(pid = c(204L, 204L, 207L, 254L, 254L, 258L, 258L, 
258L, 258L, 258L, 265L, 265L, 269L, 269L, 269L, 269L, 1520L, 
1520L, 1520L, 1520L, 1532L, 1532L, 1534L, 1534L, 1534L, 1534L, 
1539L, 1539L, 1543L, 1543L, 1546L, 1546L, 1546L, 1546L, 1546L, 
1546L, 1546L, 1549L, 1549L, 1549L, 1559L, 1559L, 1559L, 1559L, 
1559L, 1559L, 1559L, 1561L, 1561L, 1561L), cid = c(11023L, 11787L, 
14232L, 14470L, 14480L, 1290L, 1637L, 4452L, 13964L, 14590L, 
17814L, 23453L, 6658L, 10952L, 17259L, 27549L, 11034L, 22748L, 
23345L, 23347L, 10487L, 11162L, 15570L, 15629L, 17983L, 17999L, 
17531L, 22497L, 14425L, 14521L, 11495L, 24948L, 24962L, 24969L, 
24972L, 24973L, 30627L, 17886L, 18428L, 23972L, 13890L, 13936L, 
14432L, 21230L, 21271L, 21384L, 21437L, 341L, 354L, 6302L)), .Names = c("pid", 
"cid"), sorted = c("pid", "cid"), class = c("data.table", "data.frame" 
), row.names = c(NA, -50L), .internal.selfref = <pointer: 0x0000000000100788>) 

Затем, когда работает по той же формуле, я получаю ошибку

s <- sparseMatrix(test$pid,test$cid,dimnames = list(unique(test$pid), unique(test$cid)),x = 1) 

Ошибка (которое происходит в test набора данных, а) гласит следует:

Error in validObject(r) : 
    invalid class “dgTMatrix” object: length(Dimnames[[1]])' must match Dim[1] 

Проблема исчезает, когда Я удаляю dimnames, но мне действительно нужны эти dimnames, чтобы понять результаты. Я уверен, что упускаю что-то очевидное. Может кто-нибудь, пожалуйста, скажите мне, что это такое?

ответ

1

Мы можем преобразовать «PID», столбцы «ИДС» в factor и принуждать обратно numeric или использовать match с unique значения каждого столбца, чтобы получить индекс строки/столбца и это должно работать в создании sparseMatrix.

test1 <- test[, lapply(.SD, function(x) 
       as.numeric(factor(x, levels=unique(x))))] 

Или мы используем match

test1 <- test[, lapply(.SD, function(x) match(x, unique(x)))] 

s1 <- sparseMatrix(test1$pid,test1$cid,dimnames = list(unique(test$pid), 
       unique(test$cid)),x = 1) 
dim(s1) 
#[1] 15 50 

s1[1:3, 1:3] 
#3 x 3 sparse Matrix of class "dgCMatrix" 
# 11023 11787 14232 
#204  1  1  . 
#207  .  .  1 
#254  .  .  . 

head(test) 
# pid cid 
#1: 204 11023 
#2: 204 11787 
#3: 207 14232 
#4: 254 14470 
#5: 254 14480 
#6: 258 1290 

EDIT:

Если мы хотим, чтобы это для/индекс полной строки столбца, указанного в «тесте», мы должны сделать dimnames как то же самое длина как max 'pid', 'cid'

rnm <- seq(max(test$pid)) 
cnm <- seq(max(test$cid)) 
s2 <- sparseMatrix(test$pid, test$cid, dimnames=list(rnm, cnm)) 
dim(s2) 
#[1] 1561 30627 
s2[1:3, 1:3] 
#3 x 3 sparse Matrix of class "ngCMatrix" 
# 1 2 3 
#1 . . . 
#2 . . . 
#3 . . . 
+0

Спасибо @Akrun, это кажется wo rk, но я все еще озадачен. Причина в том, что это обходное решение требуется, потому что sparseMatrix требует переменных, которые отлично следуют друг за другом (1,2,3,4,5,6,7 ... по мере наступления соответствующих факторов), и это не работает с менее упорядоченными числами, такими как у меня есть в моей «dput»? Если да, есть ли причина для этого ограничения? – SJDS

+0

@simon_icl Размеры не соответствуют длине dimnames. Например, 'dim (sparseMatrix (i = test $ pid [1: 5], j = test $ cid [1: 5], x = 1)) # [1] 254 14480', в то время как мы предоставляем в dimnames 'length (unique (test $ pid [1: 5])) # [1] Он должен соответствовать. Другой способ - создать dimnames как последовательность min: max уникальных значений pid и для cid. – akrun

+0

@simon_icl Обновлено сообщение. Можете ли вы проверить, работает ли это? – akrun

Смежные вопросы