2010-12-03 5 views
10

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

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

ответ

0

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

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

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

+0

Если бы не было `ff`, я мог бы сделать что-то гораздо проще, как` с (подмножество (a.fdf, YEAR == 1999), таблицы (AGE)) `. `ff` - это часть, которая делает ее более сложной. – 2010-12-06 17:17:45

2

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

0

Мой подход был бы что-то вроде этого:

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 
Смежные вопросы