2016-07-27 2 views
1

Я написал цикл for, который берет группу из 5 строк из кадра данных и передает ее функции, после этого функция возвращает только одну строку после выполнения некоторых операций над этими 5 строками. Ниже приведен код:Альтернатива FOR Loop для ниже

for (i in 1:nrow(features_data1)){ 
    if (i - start == 4){ 
    group = features_data1[start:i,] 
    group <- as.data.frame(group) 
    start <- i+1 
    sub_data = feature_calculation(group) 
    final_data = rbind(final_data,sub_data) 
    } 
} 

Может кто-нибудь, пожалуйста, мне предложить альтернативу этому, поскольку цикл занимает много времени. Функция feature_calculation огромна.

+0

Попробуйте сначала создать вектор, содержащий группы (tip: 'rep (1: ngroups, each = 5)', а затем посмотрите на 'tapply' –

+0

. Скорость цикла for, вероятно, не является тем, что вас удерживает. попробуйте оптимизировать функцию 'feature_calculation()' и выделять 'final_data' перед циклом, а не выращивать его каждый раз - это включает в себя копирование всего объекта. – Miff

ответ

0

Попробуйте для базового R подхода:

# convert features to data frame in advance so we only have to do this once 
features_df <- as.data.frame(features_data1) 

# assign each observation (row) to a group of 5 rows and split the data frame into a list of data frames 
group_assignments <- as.factor(rep(1:ceiling(nrow(features_df)/5), each = 5, length.out = nrow(features_df))) 
groups <- split(features_df, group_assignments) 

# apply your function to each group individually (i.e. to each element in the list) 
sub_data <- lapply(X = groups, FUN = feature_calculation) 

# bind your list of data frames into a single data frame 
final_data <- do.call(rbind, sub_data) 

Вы можете быть в состоянии использовать purrr и dplyr пакеты для ускорения. Последняя имеет функцию bind_rows, которая намного быстрее, чем do.call(rbind, list_of_data_frames), если это, вероятно, будет очень большим.

+0

Эй, спасибо, это сократило время. –

Смежные вопросы