2016-08-28 19 views
1
people_id activity_id success totl_act success_rate cum_success cum_act cum_success_rate success_rate_trend 
     (fctr)  (fctr) (int) (int)  (dbl)  (int) (int)   (dbl)    (dbl) 
1  ppl_100 act2_1734928  0  1   0   0  1    0     NA 
2  ppl_100 act2_2434093  0  1   0   0  2    0     0 
3  ppl_100 act2_3404049  0  1   0   0  3    0     0 
4  ppl_100 act2_3651215  0  1   0   0  4    0     0 
5  ppl_100 act2_4109017  0  1   0   0  5    0     0 
6  ppl_100 act2_898576  0  1   0   0  6    0     0 
7 ppl_100002 act2_1233489  1  1   1   1  1    1     1 
8 ppl_100002 act2_1623405  1  1   1   2  2    1     0 
9 ppl_100003 act2_1111598  1  1   1   1  1    1     0 
10 ppl_100003 act2_1177453  1  1   1   2  2    1     0 

私はこのサンプルデータフレームを持っています。変数success_rate_trendcum_success_rate変数を使って作成したいと思います。問題は、people_idのすべての固有のアクティビティ(つまり、ユニークpeople_idの成功傾向を取得したい)を除いて、すべてactivity_idを計算することです。私は以下のコードを使用しています:For loop in Rは永遠に実行されます

success_rate_trend<-vector(mode="numeric", length=nrow(succ_rate_df)-1) 
for(i in 2:nrow(succ_rate_df)){ 
    if(succ_rate_df[i,1]!=succ_rate_df[i-1,1]){ 
     success_rate_trend[i] = NA 
     } 
     else { 
      success_rate_trend[i]<-succ_rate_df[i,8]-succ_rate_df[i-1,8] 
    }} 

実行には時間がかかります。私はsucc_rate_dfデータフレームに百万行近くあります。コードを単純化して実行時間を短縮する方法を誰でも提案できます。

答えて

3

使用ベクトル:

success_rate_trend <- diff(succ_rate_df$cum_success_rate) 
success_rate_trend[diff(as.integer(succ_rate_df$people_id)) != 0] <- NA_real_ 

注:

  1. people_idは、因子変数(fctr)です。 diff()を使用するには、as.integer()またはunclass()を使用して要因クラスを削除する必要があります。
  2. 普通のデータフレームはありませんが、tbl_dfdplyrです。索引付けのようなマトリックスは機能しません。 succ_rate_df[, 1]の代わりにsucc_rate_df$people_idまたはsucc_rate_df[["people_id"]]を使用してください。
1

ベクトル化アプローチを使用してこの計算を行うことができます。これは、より速いオーダーになります。

n = nrow(succ_rate_df) 
success_rate = succ_rate_df[2:n,1] == succ_rate_df[1:(n-1),1] 
is_true = which(success_rate) 

success_rate[is_true] = succ_rate_df[is_true+1,8]-succ_rate_df[is_true,8] 
success_rate[!success_rate] = NA 

Zheyuanリーによって答えは滑らかな印象です。

0

このデータのデータフレームバージョンに基づいて回答を提供します。 dputの出力で投稿することを習得してください。これにより、上記で印刷したような特別なプロパティを持つオブジェクトを、属性を失うことなく他のユーザーのコンソールにコピーすることができます。私のデータフレームにはdatという名前を付けるつもりです。 ave関数は、数値ベクトルを入力ベクトルと同じ長さにしたいが、その計算をグループ化ベクトルに限定したい場合は、数値ベクトルを計算するのに適しています。問題の英語の説明では、2つのグループ化が必要だと示唆しましたが、私は1つのグループ化要因しか使用しませんでした。 aveを使用してグループ化する2つの要因を持つSOの作業例があります。

success_rate_trend <- with(dat, 
        ave(cum_success_rate, people_id, FUN= function(x) c(NA, diff(x)))) 

success_rate_trend 
[1] NA 0 0 0 0 0 NA 0 NA 0 
# not a very interesting result 
+0

フィードバックに感謝します。 – Abhi

関連する問題