2017-06-04 13 views
0

以下のforループのベクトル解がありますか?これは、医療施設への入院データを含む大規模なデータセットです。forループ用のベクトル化された解答

EDITED

library(lubridate) 

dateSeq <- as.Date(c("2015-01-01", "2015-02-01")) 

admissionDate <- as.Date(c("2015-01-03", "2015-01-06", "2015-01-10", "2015-01-05", "2015-01-07", "2015-02-03", "2015-02-06")) 
Dfactor <- c("elective", "acute", "elective", "acute", "acute", "elective", "acute") 
Dfactor <- factor(Dfactor) 
df <- data.frame(admissionDate, Dfactor) 
# loop through large dataset collecting tabulated data from a factorised vector for each month (admissions date) based on 'dateSeq' 


Dfactorsums <- c() 

for (i in 1:length(dateSeq)) { 
    monthSub <- df[(df$admissionDate >= as.Date(timeFirstDayInMonth(dateSeq[i]))) & (df$admissionDate <= as.Date(timeLastDayInMonth(dateSeq[i]))), ] 
    x <- table(monthSub$Dfactor) 
    Dfactorsums[i] <- as.numeric((x[1])) 
} 

print(Dfactorsums) 
# Outcome = [1] 3 1 
# Question is rather than use a for loop is there a 'vectorized' solution. 
+1

この例に基づいて、小さな再現可能な例と予想される出力を示してください。 'df'とは何ですか? – akrun

+0

毎月 'Dfactor'の2番目の値の出現回数が必要なようです。そうですか? – rosscova

+0

右。まったく。より完全な例を少し提供します。 –

答えて

1

これは技術的には「ベクトル化」されていませんが、あなたは後にしている何をすべき、とかなり速いはずです。

library(data.table) 
setDT(df) 

df[ , month := format(AdmissionsDate, "%m") ] 
df[ , table(Dfactor)[2], by = month ] 

月をより簡単にサブセット化し、毎月必要な値を抽出するために、列を月として設定します。これは2列目のデータテーブルを出力し、2列目はDfactor出力ベクトルとなります。

+0

申し訳ありませんが、あまりにも初心者として投票することはできませんが、この作品があり、あなたが言うように、はるかに迅速です。 _apply_ typeコマンドで可能かどうか調べようとしました。これと一緒に列車などのいくつかの単純な合計を管理しているが、これは私を狐にした。 _data.table_をもっと探さなければなりません。非常に便利ですね。再度、感謝します。 –

関連する問題