Rの他の数値に基づいて、大きなデータフレームから行の数値を変更します

Jマルカンテ

複数の行と列を持つ大きなデータフレームがあり、特定の列の値を変更したいと思います。

データフレームは次のようになります。

df1=data.frame(LOCAT=c(1,2,3,4,5,6,7,8,9,10),START=c(120,345,765,1045,1347,1879,2010,2130,2400,2560),END=c(150,390,802,1120,1436,1935,2070,2207,2476,2643),CODE1=c(1,1,0,1,0,0,-1,-1,0,-1))

> df1
   LOCAT START  END CODE1
1      1   120  150     1
2      2   345  390     1
3      3   765  802     0
4      4  1045 1120     1
5      5  1347 1436     0
6      6  1879 1935     0
7      7  2010 2070    -1
8      8  2130 2207    -1
9      9  2400 2476     0
10    10  2560 2643    -1

連続する長さが1であるCODE1列のすべての「0」を直前の番号にします。つまり、i = 0&i + 1!= 0&i-1!= 0の場合、i = i-1です。

私はいくつかの式を試しましたが、それらはすべて非常に時間がかかります。これは私が試したものです:

fun = function (a)
{
for (i in 2:(length(row.names(a))-1))
{
a[a[i,4]==0 & !a[i+1,4]==0 & !a[i-1,4]==0,] <- a[i-1,4]
}
return(a)
}

成功しませんでした。また、rle関数を使用して、データフレームから長さ0の0を抽出することも考えましたが、その方法がわかりません。rleをデータフレームに適用すると、これは私が返したものの短いバージョンです。

> table(rle1)
       values
lengths  -1  -2   0   1   2
  1      20   1 278   5   0
  2      25  18   5  15   2
  3      24   5   4  14   0
  4      20   4   2   5   0
  5      15   4   0  10   1
  6      17   1   1   3   0
  7      13   1   0   5   0
  8      12   1   0   6   0
  9       8   0   0   7   0
  10      3   1   1   4   0

基本的に、長さが1の278 "0"は消えて、別の番号(-1、-2、1、または2)になるはずです。

この例は次のようになります。

> df2
   LOCAT START  END CODE1
1      1   120  150     1
2      2   345  390     1
3      3   765  802     1
4      4  1045 1120     1
5      5  1347 1436     0
6      6  1879 1935     0
7      7  2010 2070    -1
8      8  2130 2207    -1
9      9  2400 2476    -1
10    10  2560 2643    -1

私は十分に具体的であり、誰もが私を助けることができることを願っています。

前もって感謝します。

A5C1D2H2I1M1N2O1R2T1

これは、高速である可能性が高い別のアプローチです。各行が何をしているのかを示すコメントを追加しました。

within(df1, {
  # Where are the zeroes
  x <- which(CODE1 == 0)
  # Which of these don't have 0 in the previous or subsequent position
  x <- x[CODE1[x-1] != 0 & CODE1[x+1] != 0]
  # Replace CODE1 at this position with the value from the previous position
  CODE1[x] <- CODE1[x-1]
  # Remove the "x" value we created earlier
  rm(x)
})
#    LOCAT START  END CODE1
# 1      1   120  150     1
# 2      2   345  390     1
# 3      3   765  802     1
# 4      4  1045 1120     1
# 5      5  1347 1436     0
# 6      6  1879 1935     0
# 7      7  2010 2070    -1
# 8      8  2130 2207    -1
# 9      9  2400 2476    -1
# 10    10  2560 2643    -1

ふぅ!ベンチマーク!

サンプルのはるかに大きなバージョンを作成した後のベンチマークを次に示しますdata.frame

df2 <- do.call(rbind, replicate(10000, df1, simplify=FALSE))

fun <- function (a) {
  for (i in 2:(nrow(a)-1)) {
    if(a[i,4]==0 & !a[i+1,4]==0 & !a[i-1,4]==0) {
      a[i,4] <- a[i-1,4]
    }
  }
  return(a)
}
system.time(fun(df2))
#    user  system elapsed 
# 354.448   0.322 358.397 

^^痛い。欠伸。行って、それと一緒にコーヒーを飲む時間がありました。

fun1 <- function() {
  within(df2, {
    x <- which(CODE1 == 0)
    x <- x[CODE1[x-1] != 0 & CODE1[x+1] != 0]
    CODE1[x] <- CODE1[x+1]
    rm(x)
  })
} 

fun2 <- function() {
  code_1_behind <- c(0, df2$CODE1[-nrow(df2)])
  code_1_ahead  <- c(df2$CODE1[-1], 0)
  df2$CODE1 <- ifelse(code_1_behind != 0 & code_1_ahead != 0, 
                      code_1_behind, df2$CODE1)
  df2
}

library(microbenchmark)
microbenchmark(fun1(), fun2())
# Unit: milliseconds
#    expr      min       lq    median        uq      max neval
#  fun1() 16.78632 20.10185  74.80807  77.80418 128.7349   100
#  fun2() 59.36418 61.18353 114.74406 118.16778 167.3283   100

^^非常に近い。fun2()正しくないようですが、(回答の下のコメントに基づいて)あなたはそれを認識していて、それを修正することができたようです。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

他のデータフレームに基づいて、数値ベクトルのnames()をある変数から別の変数に変更します

分類Dev

Rを使用して、値の変更に基づいてデータフレームから複数の行を抽出します

分類Dev

データフレームの各行について、Rの開始から終了までの数値に基づいて複数の行を作成します

分類Dev

他のデータフレームからの一致する値に基づいて、データフレームに新しい変数を作成する

分類Dev

pandasデータフレームからのしきい値に基づいて上位n行を返します

分類Dev

前の複数の行/列の値に基づいてデータフレームの行を削除します

分類Dev

列の複数の値に基づいてデータフレームに新しい行を作成します

分類Dev

同じ行の他の列の値に基づいてデータフレーム列要素に関数を適用しますか?

分類Dev

Rの動的な値に基づいてデータフレームから列を選択します

分類Dev

条件に基づいて、データフレーム列の値を別の列の値に変更します

分類Dev

カテゴリ列のdinstict値の数に基づいて、pandasデータフレームからすべての行を削除します

分類Dev

複数の列としきい値に基づいてデータフレームをマージします

分類Dev

Rの異なるサイズのデータフレームからの複数の条件に基づいて値を一致させます

分類Dev

他の値に基づいてデータフレームの値を行に追加します

分類Dev

データフレーム内の行を反復処理し、他の列に基づいて列の値を変更します

分類Dev

別の行の値に基づいてデータフレームの行の値を更新しますか?

分類Dev

データブリックス上の別のpysparkデータフレームのいくつかの列に基づいて、大きなpysparkデータフレームの列に対してユーザー定義関数を実行します

分類Dev

Rの条件に基づいて、データフレーム内の特定の数の行を抽出しますか?

分類Dev

複数の列に基づいて、あるデータフレームの値を他のデータフレームから減算する方法は?

分類Dev

列の配置に基づいて、2つのデータフレームから数値の変動率を取得します

分類Dev

tidyverse:他の行の値に基づいてデータフレームから行を削除する

分類Dev

Rの別のデータフレーム内の列に基づいてデータフレームから変数を削除します

分類Dev

1つの列の条件に基づいて、他の列からプルして、データフレームに新しい変数を作成しますか?(dplyr)

分類Dev

R:ベクトル値に基づいてデータフレームから複数の列を削除する

分類Dev

1 つのデータフレームの 2 つの変数を「回答キー」データフレームの「キー」に一致させることに基づいて、「回答キー」データフレームから値を取得します。

分類Dev

他の列の値に基づいて、列のデータフレーム行のサブセットに関数を適用します

分類Dev

Rの特定の値を超えるすべての行に基づいて1つから複数のデータフレームを作成する

分類Dev

2つの列の変数値に基づいて、複数のデータフレームの行をサブセット化します

分類Dev

R: データフレームのリスト内の数値を、特定の定量的しきい値との関係に基づいて文字に変更するにはどうすればよいですか?

Related 関連記事

  1. 1

    他のデータフレームに基づいて、数値ベクトルのnames()をある変数から別の変数に変更します

  2. 2

    Rを使用して、値の変更に基づいてデータフレームから複数の行を抽出します

  3. 3

    データフレームの各行について、Rの開始から終了までの数値に基づいて複数の行を作成します

  4. 4

    他のデータフレームからの一致する値に基づいて、データフレームに新しい変数を作成する

  5. 5

    pandasデータフレームからのしきい値に基づいて上位n行を返します

  6. 6

    前の複数の行/列の値に基づいてデータフレームの行を削除します

  7. 7

    列の複数の値に基づいてデータフレームに新しい行を作成します

  8. 8

    同じ行の他の列の値に基づいてデータフレーム列要素に関数を適用しますか?

  9. 9

    Rの動的な値に基づいてデータフレームから列を選択します

  10. 10

    条件に基づいて、データフレーム列の値を別の列の値に変更します

  11. 11

    カテゴリ列のdinstict値の数に基づいて、pandasデータフレームからすべての行を削除します

  12. 12

    複数の列としきい値に基づいてデータフレームをマージします

  13. 13

    Rの異なるサイズのデータフレームからの複数の条件に基づいて値を一致させます

  14. 14

    他の値に基づいてデータフレームの値を行に追加します

  15. 15

    データフレーム内の行を反復処理し、他の列に基づいて列の値を変更します

  16. 16

    別の行の値に基づいてデータフレームの行の値を更新しますか?

  17. 17

    データブリックス上の別のpysparkデータフレームのいくつかの列に基づいて、大きなpysparkデータフレームの列に対してユーザー定義関数を実行します

  18. 18

    Rの条件に基づいて、データフレーム内の特定の数の行を抽出しますか?

  19. 19

    複数の列に基づいて、あるデータフレームの値を他のデータフレームから減算する方法は?

  20. 20

    列の配置に基づいて、2つのデータフレームから数値の変動率を取得します

  21. 21

    tidyverse:他の行の値に基づいてデータフレームから行を削除する

  22. 22

    Rの別のデータフレーム内の列に基づいてデータフレームから変数を削除します

  23. 23

    1つの列の条件に基づいて、他の列からプルして、データフレームに新しい変数を作成しますか?(dplyr)

  24. 24

    R:ベクトル値に基づいてデータフレームから複数の列を削除する

  25. 25

    1 つのデータフレームの 2 つの変数を「回答キー」データフレームの「キー」に一致させることに基づいて、「回答キー」データフレームから値を取得します。

  26. 26

    他の列の値に基づいて、列のデータフレーム行のサブセットに関数を適用します

  27. 27

    Rの特定の値を超えるすべての行に基づいて1つから複数のデータフレームを作成する

  28. 28

    2つの列の変数値に基づいて、複数のデータフレームの行をサブセット化します

  29. 29

    R: データフレームのリスト内の数値を、特定の定量的しきい値との関係に基づいて文字に変更するにはどうすればよいですか?

ホットタグ

アーカイブ