リストの付属物を含むネストされたforループを最適化する方法は?

ノーティカ

と呼ばれるAPIからデータを取得するために開発したパッケージを使用して、英国の公衆衛生機関から特定の地理的領域と特定の指標のデータを抽出しfingertipsR、リストがリスト(地理)で構成される空のリストに挿入しています。 )各インジケーターを表すリストが含まれています。

geog <- c("E38000220", "E38000046", "E38000144", "E38000191", "E38000210", 
"E38000038", "E38000164", "E38000195", "E38000078", "E38000139", 
"E38000166", "E38000211", "E38000147", "E38000183", "E38000028", 
"E38000053", "E38000126", "E38000153", "E38000173", "E38000175"
)
indicators <- c(241, 92588, 90672, 90692, 90697, 90698, 90701, 90702, 91238, 
90690, 90694, 93245, 93246, 93244, 93247, 93248, 93049, 93047, 
90700)

## install.packages("fingertipsR"); library(fingertipsR)
library(dplyr)

list <- list()

start <- Sys.time()
for (geog_group in geog) {
    for (indicator_number in indicators) {
    list[[geog_group]][[as.character(indicator_number)]] <- fingertips_data(IndicatorID = indicator_number, AreaTypeID = c(152, 153, 154)) %>% 
      filter(AreaCode == geog_group, TimeperiodSortable == max(TimeperiodSortable)) %>% 
      select(Timeperiod, Value) %>% distinct()
  }
}
end <- Sys.time()
end-start

私の仕事用ラップトップでは、これを実行するのに約15分かかります-このコードを最適化する簡単な方法があるかどうか疑問に思っています-おそらくlapplyまたはpurrr

編集:理想的には、各地理的領域のインジケーターが1つのデータフレームに含まれるようにします。これらはすべて同じ列Time period共有Valueし、後で処理する予定でしたunlist()が、誰かがfor内でそれを解決する方法がある場合ループ私は提案を受け入れています。

誰も

これがより凝縮されたループです(約25秒かかります)。

result_list <- list(length(indicators))
for (k in seq_along(indicators)) {
  ind   <- indicators[k]
  # load the data once per indicator
  tmpDF <- fingertips_data(IndicatorID = ind, AreaTypeID = 152:154)
  # retrieve the rows corresp. to max per geog
  out <- t(vapply(seq_along(geog), function (s) {
    row_geog <- which(.subset2(tmpDF, which(names(tmpDF) == 'AreaCode')) == geog[s])
    row_max <- which.max(.subset2(tmpDF, which(names(tmpDF) == 'TimeperiodSortable'))[row_geog])
    res <- tmpDF[row_geog,c("Timeperiod","Value")][row_max,]
    res <- c(Timeperiod = res$Timeperiod, Value = res$Value)
    if (length(res) == 0) res <- c(Timeperiod = NA_character_, Value = NA_character_)
    return (res)
  }, character(2)))
  # save result for indicator[k]
  result_list[[k]] <- data.frame(indicator = ind, geog, 
                                 Timeperiod = out[,1], 
                                 Value = as.numeric(out[,2]),
                                 stringsAsFactors = FALSE)  
}

私はあまり詳しくありませんfingertipsRが、仕事は完了しているようです(間違っている場合は訂正してください)。結果の最初の要素は次のとおりです。

head(result_list[[1]])
# indicator      geog Timeperiod    Value
# 1       241 E38000220    2017/18 8.214912
# 2       241 E38000046    2017/18 7.907130
# 3       241 E38000144    2017/18 9.139239
# 4       241 E38000191    2017/18 8.891195
# 5       241 E38000210    2017/18 8.311592
# 6       241 E38000038    2017/18 6.653444

変更点

これが私があなたのバージョンから変更したものです:

  • インジケーターを反復処理するforループを1つだけ作成しました(厳密に言えば、使用しているバージョンにはまだ2つのループがありますvapply)。主な理由は、ループを少なくすることではなく(それ自体はすでに十分な動機付けです)、関数fingertips_dataをできるだけ少なく呼び出すことでした。これらの関数呼び出しは非常に遅く、依存せずgeog、サブセット化のみが行います。
  • したがって、すべてindicatorの関数に対して1fingertips_data回呼び出されvapply、サブセットを使用して最大値を見つけることが行われます。
  • その結果、出力の形式はわずかに異なりますが、基本的に同じ情報が含まれています

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

GNU並列で巨大なデータセットのネストされたforループを含むbashスクリプトを並列化する方法は?

分類Dev

これらのネストされたループを最適化する方法は?

分類Dev

Pythonでネストされたforループを最適化する方法

分類Dev

rのネストされたforループを最適化する

分類Dev

ネストされたforループとjavascriptのifステートメントを最適化する

分類Dev

このネストされたSQLSELECTクエリを最適化する方法

分類Dev

Swiftでネストされたforループを最適化する

分類Dev

Swiftでネストされたforループを最適化する

分類Dev

Rubyでネストされたループを最適化する

分類Dev

IF条件でネストされたwhileループを最適化する

分類Dev

リストを含むオブジェクトのフィルタリングを最適化する方法は?

分類Dev

MATLABでcircshiftを含む複数のネストされたループをベクトル化する

分類Dev

ネストされたforループを使用して関数を最適化する方法

分類Dev

rの行列で計算するためにネストされたforループを最適化する

分類Dev

ネストされたifステートメント内のネストされたforループを最適化する

分類Dev

forループにネストされた条件付きトリプルをベクトル化する方法-MATLAB

分類Dev

ネストされたリストの要素をグループ化する方法は?

分類Dev

ネストされた条件付きSQLServerクエリ2008R2を最適化する方法

分類Dev

ネストされたif句を最適化する方法はありますか?

分類Dev

最適化されたrequire.jsを使用して外部スクリプトをロードする方法は?

分類Dev

Rのサブセット化されたデータを含むリストに関数を適用する

分類Dev

リンクのリストを最後に含む番号付き引用スタイルなど、プリンタに適した方法でリンクを出力するにはどうすればよいですか?

分類Dev

ネストされたPythonforループを最適化しますか?

分類Dev

最適化:最も最適化された方法でクラスターのリストを作成します

分類Dev

Cのopenmpで、qsortのネストされた比較関数を含むforループを並列化するにはどうすればよいですか?

分類Dev

Java 8でハッシュマップを作成するために使用されるこれらのネストされたforループを最適化する最良の方法は何ですか?

分類Dev

ログファイルを色付けするためのスクリプトを最適化する方法

分類Dev

グループ化されたリストのリストをグループ化する方法は?

分類Dev

GCCを使用したC / C ++のループ内のネストされたifステートメントを最適化する

Related 関連記事

  1. 1

    GNU並列で巨大なデータセットのネストされたforループを含むbashスクリプトを並列化する方法は?

  2. 2

    これらのネストされたループを最適化する方法は?

  3. 3

    Pythonでネストされたforループを最適化する方法

  4. 4

    rのネストされたforループを最適化する

  5. 5

    ネストされたforループとjavascriptのifステートメントを最適化する

  6. 6

    このネストされたSQLSELECTクエリを最適化する方法

  7. 7

    Swiftでネストされたforループを最適化する

  8. 8

    Swiftでネストされたforループを最適化する

  9. 9

    Rubyでネストされたループを最適化する

  10. 10

    IF条件でネストされたwhileループを最適化する

  11. 11

    リストを含むオブジェクトのフィルタリングを最適化する方法は?

  12. 12

    MATLABでcircshiftを含む複数のネストされたループをベクトル化する

  13. 13

    ネストされたforループを使用して関数を最適化する方法

  14. 14

    rの行列で計算するためにネストされたforループを最適化する

  15. 15

    ネストされたifステートメント内のネストされたforループを最適化する

  16. 16

    forループにネストされた条件付きトリプルをベクトル化する方法-MATLAB

  17. 17

    ネストされたリストの要素をグループ化する方法は?

  18. 18

    ネストされた条件付きSQLServerクエリ2008R2を最適化する方法

  19. 19

    ネストされたif句を最適化する方法はありますか?

  20. 20

    最適化されたrequire.jsを使用して外部スクリプトをロードする方法は?

  21. 21

    Rのサブセット化されたデータを含むリストに関数を適用する

  22. 22

    リンクのリストを最後に含む番号付き引用スタイルなど、プリンタに適した方法でリンクを出力するにはどうすればよいですか?

  23. 23

    ネストされたPythonforループを最適化しますか?

  24. 24

    最適化:最も最適化された方法でクラスターのリストを作成します

  25. 25

    Cのopenmpで、qsortのネストされた比較関数を含むforループを並列化するにはどうすればよいですか?

  26. 26

    Java 8でハッシュマップを作成するために使用されるこれらのネストされたforループを最適化する最良の方法は何ですか?

  27. 27

    ログファイルを色付けするためのスクリプトを最適化する方法

  28. 28

    グループ化されたリストのリストをグループ化する方法は?

  29. 29

    GCCを使用したC / C ++のループ内のネストされたifステートメントを最適化する

ホットタグ

アーカイブ