Rの/別の列に基づいていくつかの列の値を置き換える方法は?

アーミン

私は新しいRユーザーであり、コードをより効率的にしようとしています。

私はいくつかの列を数える非常に巨大なデータフレームを持っています。別の列の値に基づいて、いくつかの列の値を置き換えようとしています。

条件文やループでそれを行う方法は知っていますが、データが大きいので可能な限り最適化したいと思います。

いくつかのテストデータを持ってみましょう:

# data.frame creation function
make_d <- 
  function(n_rows = 5000000){
    d <- 
      data.frame(
        "col_1" = sample(   0:3, n_rows, replace = TRUE), 
        "col_2" = sample(1:1000, n_rows, replace = TRUE), 
        "col_3" = sample(1:1000, n_rows, replace = TRUE), 
        "col_4" = sample(1:1000, n_rows, replace = TRUE), 
        "col_5" = sample(1:1000, n_rows, replace = TRUE), 
        "col_6" = sample(1:1000, n_rows, replace = TRUE), 
        "col_7" = sample(1:1000, n_rows, replace = TRUE), 
        "col_8" = sample(1:1000, n_rows, replace = TRUE), 
        "col_9" = sample(1:1000, n_rows, replace = TRUE)
      )
    # return
    d
  }

# create data.frame
d <- make_d()

# first lines of data.frame
head(d)
##   col_1 col_2 col_3 col_4 col_5 col_6 col_7 col_8 col_9
## 1     3    94   802   960   460   346   212   387   665
## 2     0   637   443   249     0     0     0     0     0
## 3     2    26   192   438   562   487   623   604   853
## 4     0   421   667   511     0     0     0     0     0
## 5     3   726   994    58   384   700   307   885   832
## 6     1   567   798   185   117   394   894   745   134

からの列が欲しいのですが...

  • col1が0に等しい場合col5からcol9が0に等しい
  • col1が3に等しい場合col2からcol9が0に等しい
  • col1が2に等しい場合col7およびcol9が0に等しい場合

私がこれまで試したことはあまり効率的ではありませんでした。複数の列を同時に実行したり、回避したりすることができませんでしたif_else()

library(microbenchmark)
library(dplyr)

microbenchmark(
  setup = { d <- make_d() },
  dplyr_mutate = {
      d <- 
        d %>% 
        mutate(
          col_5 = if_else(col_1 == 0, 0L, col_5),
          col_6 = if_else(col_1 == 0, 0L, col_6),
          col_7 = if_else(col_1 == 0, 0L, col_7),
          col_8 = if_else(col_1 == 0, 0L, col_8),
          col_9 = if_else(col_1 == 0, 0L, col_9), 


          col_2 = if_else(col_1 == 3, 0L, col_2),
          col_3 = if_else(col_1 == 3, 0L, col_3),
          col_4 = if_else(col_1 == 3, 0L, col_4),
          col_5 = if_else(col_1 == 3, 0L, col_5),
          col_6 = if_else(col_1 == 3, 0L, col_6),
          col_7 = if_else(col_1 == 3, 0L, col_7),
          col_8 = if_else(col_1 == 3, 0L, col_8),
          col_9 = if_else(col_1 == 3, 0L, col_9),

          col_7 = if_else(col_1 == 2, 0L, col_7), 
          col_9 = if_else(col_1 == 2, 0L, col_9)
        )},
  times = 10
)

## Unit: milliseconds
##          expr      min       lq    mean   median       uq      max neval
##  dplyr_mutate 412.3384 429.2278 531.884 538.8701 562.7804 793.9565    10
ジェイソンマシューズ

私がそれを正しく理解しているなら、これはあなたが探しているものですか?

スピードアップ:〜1.3x

library(microbenchmark)
library(dplyr)

microbenchmark(
  setup = { d <- make_d() },
  dplyr_mutate_at = 
  {
    d %>%
      mutate_at(vars(col_5:col_9) , funs(ifelse(col_1 == 0, 0,. ))) %>%
      mutate_at(vars(col_2:col_9) , funs(ifelse(col_1 == 3, 0,. ))) %>%
      mutate_at(vars(col_7,col_9) , funs(ifelse(col_1 == 2, 0,. )))
  },

  times = 10
)

##    Unit: milliseconds
##                  expr      min       lq     mean   median       uq      max neval
##          dplyr_mutate 395.5998 423.7178 496.1036 436.8839 551.8601 859.9627    10
##       dplyr_mutate_at 365.0635 378.3087 404.1069 392.1462 400.7426 551.8507    10

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

別の列の値に基づいて1つの列の値を置き換える方法は?

分類Dev

Pysparkの別の列に基づく式の評価に基づいて、列の値を条件付きで置き換える方法は?

分類Dev

Pysparkの別の列に基づく式の評価に基づいて、列の値を条件付きで置き換える方法は?

分類Dev

別の列の値に基づいて列のNaN値を置き換える方法は?

分類Dev

別の列の値に基づいてDataFrame列の値を置き換える

分類Dev

別の列の値に基づいて列の値を置き換える

分類Dev

別の列の条件に基づいて、列のNaN値を置き換える方法は?

分類Dev

Pythonのリストに基づいて列のいくつかの値を置き換える

分類Dev

行列の値を列/行の名前に基づいて別の行列に置き換える方法は?

分類Dev

別の値に基づいて配列内の値を置き換える

分類Dev

リストに基づいて列の値を置き換える方法は?

分類Dev

別の列の値に基づいてテキストを置き換える

分類Dev

numpy配列の0の値を、列の範囲に基づいて他の値に置き換える方法は?

分類Dev

別の列の値に基づいて、1つの列のNaNを文字列に置き換えます

分類Dev

OpenRefine-ある列の文字列値を別の列の値に基づいて置き換えない

分類Dev

別の列の値に基づいてデータフレームの値を置き換える方法

分類Dev

列名と一致するように別の列の値に基づいて欠落している値を置き換える方法はありますか?

分類Dev

他のいくつかの列の条件に基づいて、別の列の値で列を埋める方法は?

分類Dev

同じ列Rを持つ別のdfに基づく列の一部の値を置き換える

分類Dev

他の2つの列に基づいてnumpy配列の値を置き換える方法

分類Dev

別のパンダ列の値に基づいて文字列を置き換える方法

分類Dev

配列の別の部分に基づいて配列の一部を置き換える方法は?

分類Dev

Rまたはpythonの条件に基づいて、ある列のリストの値を別の列のリストの値に置き換えます

分類Dev

他の列に基づいて値を置き換える

分類Dev

列内のNAを、別の列の値に基づいて所定の値に置き換える

分類Dev

NaN値を別の列の値に基づいて別の列の平均に置き換える方法は?パンダ

分類Dev

列の値に基づいて列の値を置き換える

分類Dev

別の列に基づいて、列の欠落している値を手動で置き換える

分類Dev

別の配列の値に基づいて、ある配列の値を置き換えます

Related 関連記事

  1. 1

    別の列の値に基づいて1つの列の値を置き換える方法は?

  2. 2

    Pysparkの別の列に基づく式の評価に基づいて、列の値を条件付きで置き換える方法は?

  3. 3

    Pysparkの別の列に基づく式の評価に基づいて、列の値を条件付きで置き換える方法は?

  4. 4

    別の列の値に基づいて列のNaN値を置き換える方法は?

  5. 5

    別の列の値に基づいてDataFrame列の値を置き換える

  6. 6

    別の列の値に基づいて列の値を置き換える

  7. 7

    別の列の条件に基づいて、列のNaN値を置き換える方法は?

  8. 8

    Pythonのリストに基づいて列のいくつかの値を置き換える

  9. 9

    行列の値を列/行の名前に基づいて別の行列に置き換える方法は?

  10. 10

    別の値に基づいて配列内の値を置き換える

  11. 11

    リストに基づいて列の値を置き換える方法は?

  12. 12

    別の列の値に基づいてテキストを置き換える

  13. 13

    numpy配列の0の値を、列の範囲に基づいて他の値に置き換える方法は?

  14. 14

    別の列の値に基づいて、1つの列のNaNを文字列に置き換えます

  15. 15

    OpenRefine-ある列の文字列値を別の列の値に基づいて置き換えない

  16. 16

    別の列の値に基づいてデータフレームの値を置き換える方法

  17. 17

    列名と一致するように別の列の値に基づいて欠落している値を置き換える方法はありますか?

  18. 18

    他のいくつかの列の条件に基づいて、別の列の値で列を埋める方法は?

  19. 19

    同じ列Rを持つ別のdfに基づく列の一部の値を置き換える

  20. 20

    他の2つの列に基づいてnumpy配列の値を置き換える方法

  21. 21

    別のパンダ列の値に基づいて文字列を置き換える方法

  22. 22

    配列の別の部分に基づいて配列の一部を置き換える方法は?

  23. 23

    Rまたはpythonの条件に基づいて、ある列のリストの値を別の列のリストの値に置き換えます

  24. 24

    他の列に基づいて値を置き換える

  25. 25

    列内のNAを、別の列の値に基づいて所定の値に置き換える

  26. 26

    NaN値を別の列の値に基づいて別の列の平均に置き換える方法は?パンダ

  27. 27

    列の値に基づいて列の値を置き換える

  28. 28

    別の列に基づいて、列の欠落している値を手動で置き換える

  29. 29

    別の配列の値に基づいて、ある配列の値を置き換えます

ホットタグ

アーカイブ