создать хеш-значение для каждой строки данных в кадре данных в R - PullRequest
3 голосов
/ 23 февраля 2011

Я изучаю, как более эффективно сравнить два кадра данных в R, и я придумываю хэш.

Мой план состоит в том, чтобы создать хэш для каждой строки данных в двух фреймах данных с одинаковыми столбцами, используя digest в digest пакете, и я полагаю, что хеш-код должен быть одинаковым для любых двух идентичных строк данных.

Я попытался дать уникальный хеш для каждой строки данных, используя следующий код:

for (loop.ssi in (1:nrow(ssi.10q3.v1)))
    {ssi.10q3.v1[loop.ssi,"hash"] <- digest(as.character(ssi.10q3.v1[loop.ssi,]))
     print(paste(loop.ssi,nrow(ssi.10q3.v1),sep="/"))
     flush.console()
    }

Но это очень медленно.

Правильный ли мой подход при сравнении данных? Если да, какие-либо предложения по ускорению кода выше? Спасибо.

UPDATE

Я обновил код, как показано ниже:

ssi.10q3.v1[,"uid"] <- 1:nrow(ssi.10q3.v1)   

ssi.10q3.v1.hash <- ddply(ssi.10q3.v1,
                          c("uid"),
                          function(df)
                             {df[,"uid"]<- NULL
                              hash <- digest(as.character(df))
                              data.frame(hash=hash)
                             },
                          .progress="text")     

Я самостоятельно сгенерировал столбец uid для «уникальной» цели.

Ответы [ 2 ]

5 голосов
/ 23 февраля 2011

Если я получу то, что вы хотите правильно, дайджест будет работать напрямую с apply:

library(digest)
ssi.10q3.v1.hash <- data.frame(uid = 1:nrow(ssi.10q3.v1), hash = apply(ssi.10q3.v1, 1, digest))
0 голосов
/ 23 февраля 2011

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

rowSums(df2 == df1) == ncol(df1)

Если предположить, что оба data.frames имеют одинаковые измерения, это будет FALSE для каждой строки, которая не идентична. Если вам необходимо также проверить имена строк, ими можно управлять отдельно и в сочетании с проверкой содержимого, а также аналогично для имен столбцов (и атрибутов, и строгих проверок типов столбцов).

 rowSums(df2 == df1) == ncol(df1) & rownames(df2) == rownames(df1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...