Непонятный пример в документации big.matrix (применимо)
Я новичок в big.matrix
и связанные пакеты, я пытаюсь воспроизвести следующий пример ```
Loading required package: stats
> Sys.setenv(LANG = "en")
> library(bigmemory)
Loading required package: bigmemory.sri
bigmemory >= 4.0 is a major revision since 3.1.2; please see package
biganalytics and http://www.bigmemory.org for more information.
> x <- big.matrix(5, 2, type="integer", init=0, dimnames=list(NULL, c("alpha", "beta")))
> x[,] <- round(rnorm(10))
Assignment will down cast from double to integer
Hint: To remove this warning type: options(bigmemory.typecast.warning=FALSE)
Mensajes de aviso perdidos
In SetAll.bm(x, value) :
> x
An object of class "big.matrix"
Slot "address":
<pointer: 0x22a1620>
> x[,]
alpha beta
[1,] -2 0
[2,] -1 0
[3,] 0 -1
[4,] 2 1
[5,] 0 0
> apply(x, 1, mean)
Error en as.vector(data) :
ningún método para coaccionar a esta clase S4 a un vector
из документации, но последняя строка дает мне следующую ошибку:
Error en as.vector(data) :
ningún método para coaccionar a esta clase S4 a un vector
Последняя строка говорит что-то вроде "there is no method for transform this S4 class to a vector"
Не могли бы вы дать мне указатель?
Моя версия R
R.version
_
platform x86_64-unknown-linux-gnu
arch x86_64
os linux-gnu
system x86_64, linux-gnu
status
major 2
minor 15.1
year 2012
month 06
day 22
svn rev 59600
language R
version.string R version 2.15.1 (2012-06-22)
nickname Roasted Marshmallows
3 ответа
Вы пытаетесь позвонить apply
в объекте большой памяти. Последние не имеют неявного метода для преобразования в матрицу (аргумент необходим для применения)
apply(x, 1, mean)
Error in as.vector(data) :
no method for coercing this S4 class to a vector
Принудительное преобразование в матрицу, исправить проблему
apply(as.matrix(x), 1, mean)
[1] -1.5 -0.5 1.0 -0.5 -0.5
Изменить после ОП ответа:
Пакет biganalytics дополняет пакет bigmemory различной аналитикой. Функции bigkmeans и binit могут также использоваться с собственными объектами R. Но будь осторожен:
применять для объектов big.matrix. Обратите внимание, что производительность может быть ухудшена (по сравнению с применением с обычными матрицами R) из-за накладных расходов S4, связанных с извлечением данных из объектов big.matrix. Такое ограничение неизбежно и будет иметь место (или даже хуже) с другими "пользовательскими" структурами данных. Конечно, это будет только частично значимо, если вы применяете более длинные строки или столбцы.
Для tapply-подобных функций также может быть полезен пакет bigtabulate. Идея этого пакета состоит в том, чтобы выполнить работу в 2 этапа.
Мы обнаружили, что bigsplit, за которым следует lapply или sapply, может быть особенно эффективным, когда подмножества, создаваемые разделением, имеют разумный размер.
Ну, я обнаружил ошибку благодаря предыдущему ответу (#agstudy, я даю вам +1)... apply
Метод был из base
пакет, если я загружу biganalytics
пакеты, все работает как шарм...
> library(biganalytics)
> apply(x, 1, mean)
[1] 0.0 1.5 0.5 -1.0 0.5
Еще раз спасибо!
Этот ответ немного не по теме от исходного вопроса, а не "почему не apply(...)
работать?", который @agstudy ответил выше, но" как мне получить средства для строки bigmemory
объект? "Я погуглил "r bigmemory rowmeans"
и закончил здесь: http://www.stat.yale.edu/~jay/HPCwR/examples/bioinfo/bioinfo3.txt
Воспроизведение интересного фрагмента:
# Get the row means, three different ways.
system.time({
a <- rep(0, nrow(z))
for (i in 1:nrow(z)) {
a[i] <- mean(z[i,])
}
}) # Will definitely work on both matrix and big.matrix
# matrix timing: about 30 seconds
# big.matrix timing: about 270 seconds
# The price for using bigmemory with lots of very small
# operations is the overhead of S3/S4 dispatch.
system.time({
a <- apply(z, 1, mean)
}) # Works on a matrix only; interesting that it is slower.
# matrix timing: 45 seconds
system.time({
myfunc <- function(i) return(mean(z[i,]))
a <- sapply(1:nrow(z), myfunc)
}) # Will definitely work on both matrix and big.matrix
# matrix timing: About 40 seconds
# big.matrix timing: About 306 seconds
В этом примере показано, как использовать параллельные методы (doMC
и т. д.) для вычисления ряда средств.