2013-02-11 3 views
0

Я пытаюсь добавить некоторые функции в группы. Data.frame ниже (сгруппированных) мой «ключ» (думаю, Excel ВПР):Как сделать следующую функцию «применить» в R более эффективной?

  Original Grouped 
1   Features Constant 
2  PhoneService Constant 
3 PhoneServices Constant 
4  Surcharges Constant 
5  CallingPlans Constant 
6   Taxes Constant 
7   LDUsage Noise 
8 RegionalUsage Noise 
9  LocalUsage Noise 
10  Late fees Noise 
11 SpecialServices Noise 
12   TFUsage Noise 
13  VoipUsage Noise 
14   CCUsage Noise 
15   Credits Credits 
16   OneTime OneTime 

Я тогда ссылаться на свою базу данных, которая содержит столбец (BillSection), который берет на себя конкретное значение из сгруппированных $ Original, и Я хочу сгруппировать его в соответствии с группировкой $ Grouped. Я использую функцию sapply для выполнения этой операции. Затем я вставляю результат в исходный файл данных.

grouper<-as.character(sapply(as.character(bill.data$BillSection[1:100]), # for the first 100 records of the data.frame bill.data 
     function(x)grouped[grouped$Original==x,2])) # take the second column, i.e. Grouped, for the corresponding "TRUE" value in Original 
cbind(bill.data[1:100,],as.data.frame(grouper)) 

Приведенный выше код работает, как ожидалось, но это медленно, когда я применяю его на всю мою базу данных, которая превышает 10000000 уникальные записи. Есть ли альтернатива этому методу? Я знаю, что могу использовать plyr, но он еще медленнее (я думаю), чем просто. Я пытался понять это с помощью data.table, но не повезло. Любые предложения будут полезны. Я открыт для кодирования этого в Python, к которому я новичок, но слышал намного быстрее, чем R, поскольку я часто занимаюсь крупными наборами данных. Я хотел знать, сможет ли R сделать это достаточно быстро, чтобы быть полезным.

Спасибо!

+1

Я не могу сказать, что вы пытаетесь выполнить здесь (может быть, описать это словами, а не кодом?), Но если вы 'cbind'ing повторно для каждой группы 100, которые могли бы [легко убить производительность] (http://stackoverflow.com/questions/2908822/speed-up-the-loop-operation-in-r/8474941#8474941). –

+0

Я только один раз, в конце. Я пытаюсь «найти» значение в bill.data $ BillSection (который будет «Features», «OneTime», «PhoneServices» и т. Д.) И группировать его в «Constant», «Noise», «OneTime» »или« Кредиты »). Это будет использоваться для последующего построения. – ilanman

ответ

2

Я не уверен, что я понимаю ваш вопрос, но можете ли вы использовать merge()? то есть ...

merge(big.df, group.names.df, by.x='orginal.column.in.big.df', 
     by.y='original', all.x=T) 

NB. Plyr имеет параллельный вариант ...

+1

Это прекрасно. Просто FYI, вот несколько системных сравнений, используя мой оригинальный метод (не считая 'cbind'ing) на 100K-записях:' user system elapsed' '22.05 0.00 22.07' И теперь, используя предложение Шона: ' пользовательская система истек 1.10 0.03 1.12 ' – ilanman

+2

Хорошие новости! Если вам нравится ответ, вы можете нажать и принять! :) – Sean