2016-07-27 5 views
1

私は、データフレームから5行のグループをとり、それを関数に渡すforループを作成しました。そして関数は、これらの5つの行に対していくつかの操作を行った後にただ1つの行を返します。コードは以下の通りです:FORループの代わりに

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) 
    } 
} 

誰かが私にこの代替案を提案してください。forループは時間がかかります。関数feature_calculationは膨大です。

+0

最初にグループを含むベクタを作成してみましょう(ヒント: '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で、これは非常に大きいと思われる場合は​​3210よりはるかに高速です。

+0

ありがとう。 –

関連する問題