Подмножество объектов ffdf в R - PullRequest
10 голосов
/ 03 декабря 2010

Я использую пакет R's ff, и у меня есть несколько ffdf объектов (размеры около 1.5M x 80), с которыми мне нужно работать.У меня возникли некоторые проблемы, связанные с эффективными операциями нарезки / нарезки кубиками.

Например, у меня есть два целочисленных столбца с именами "YEAR" и "AGE", и я хочу создать таблицуВОЗРАСТ, когда ГОД 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() быстрая, но построение битового вектора происходит довольно медленно.У кого-нибудь есть какие-либо рекомендации, как сделать это лучше?

Ответы [ 3 ]

1 голос
/ 13 июня 2013

Пакет ffbase предоставляет множество базовых функций для ff / ffdf объектов, включая subset.ff.После небольшого тестирования кажется, что subset.ff относительно быстро.Попробуйте загрузить ffbase и затем использовать более простой код, который вы предложили из предыдущего комментария (with(subset(a.fdf, YEAR==1999)).

0 голосов
/ 14 августа 2013

Мой подход будет примерно таким:

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
0 голосов
/ 04 декабря 2010

Не знаком с манипулированием ff объектами, но описанная вами проблема звучит как классическая tapply() задача:

answer <- tapply(a.fdf$YEAR[a.fdf$YEAR == 1995], a.fdf$AGE[a.fdf$YEAR == 1995], length)

Я бы предположил, что нечто подобное будет двигаться быстрее, чем двухшаговое решениеВы даете выше, но, возможно, я неправильно понимаю, как работают ff структуры данных?

...