5

データ テーブルがあり、一意の日ごとに新しい列を作成し、その日が列名と一致する各行に 1 を割り当てたい

forループを使用してこれを行いましたが、data.tableとsetを使用して最適化する方法があるかどうか疑問に思っていましたか?

ここに例があります

dt <- data.table(Week_Day = c("Monday", "Tuesday", "Wednesday",
                          "Thursday", "Friday", "Saturday", "Sunday"))

Day <- unique(dt$Week_Day)
for (i in 1:length(Day)) {
    if (Day[i] != "Sunday") {
        dt[, Day[i] := ifelse(Week_Day == Day[i], 1, 0)]
    }
}

私のテーブルは298k行で、実行に時間がかかりませんが(以下)、長いスクリプトの一部であり、非効率的なループがかなりあるため、全体の実行時間を短縮しようとしています.

実行時間:

user  system elapsed
0.99    0.06    1.05

前もって感謝します。

4

2 に答える 2

4

高速化の試みの 1 つを次に示します。

Day <- unique(dt$Week_Day)
setkey(dt, Week_Day)

# create columns of 0s
dt[, (Day) := 0L]

for (i in seq_along(head(Day, -1))) {
     dt[Day[i], Day[i] := 1L]
}

これにより、2 番目のチェーンでのバイナリ検索と参照による置換data.tableの排除を含む、いくつかの高速化が実装されます。ifelse

于 2016-07-22T12:33:32.050 に答える