Подмножество объектов ffdf в R
Я использую пакет R ff
, и у меня есть некоторые объекты ffdf
(размеры около 1.5M x 80), с которыми мне нужно работать. У меня возникают проблемы с тем, что я использую эффективные операции нарезки/нарезки.
Например, у меня есть два целых столбца с именем "YEAR" и "AGE", и я хочу создать таблицу AGE, когда YEAR - 2005.
Один из подходов заключается в следующем:
ffwhich <- function(x, expr) {
b <- bit(nrow(x))
for(i in chunk(x)) b[i] <- eval(substitute(expr), x[i,])
b
}
bw <- ffwhich(a.fdf, YEAR==1999)
answer <- table(a.fdf[bw, "AGE"])
Операция table()
выполняется быстро, но создание битового вектора происходит довольно медленно. У кого-нибудь есть рекомендации для этого лучше?
Ответы
Ответ 1
Пакет ffbase
предоставляет множество базовых функций для объектов ff
/ffdf
, включая subset.ff
. С немного ограниченным тестированием кажется, что subset.ff
относительно быстр. Попробуйте загрузить ffbase
, а затем используйте более простой код, предложенный вами из предыдущего комментария (with(subset(a.fdf, YEAR==1999)
).
Ответ 2
Не знакомы с управлением объектами ff
, но описанная вами проблема звучит как классическая задача tapply()
:
answer <- tapply(a.fdf$YEAR[a.fdf$YEAR == 1995], a.fdf$AGE[a.fdf$YEAR == 1995], length)
Я бы предположил, что что-то подобное движется быстрее, чем предлагаемое выше двухэтапное решение, но, может быть, я не понимаю, как работают структуры данных ff
?
Ответ 3
Мой подход будет примерно таким:
system.time({
index <- as.ff( which( a.fdf[,'Location'] == 'exonic') );
table(a.fdf[index,][,'Function']);
});
user system elapsed
1.128 0.172 1.317
Кажется, это значительно быстрее, чем:
system.time({
bw <- ffwhich(a.fdf, Location=="exonic");
table(a.fdf[bw,'Function']);
})
user system elapsed
24.901 0.208 25.150
YMMV, так как это факторы, а не символы, а мой ffdf ~ 4.3M * 42.
identical(table(a.fdf[bw,'Function']), table(a.fdf[index,][,'Function']));
[1] TRUE