R:前の行に特定の値が含まれている場合は行を更新します

A.スミス

個々の鳥が巣を訪れたときに記録するRFIDリーダーから取得した一連のデータがあります。しかし、ボードのエラーは、ボードが1日スキャンを停止することが多いことを意味していたため、鳥が巣を訪れたかどうかはわかりません。データセットには、最新の検出時刻と前回の検出日時の両方の記録が含まれています。前回の既知の訪問の前のいずれかの日にボードがオフになったときに、この「前回の訪問」列を「不明」に更新したいと思います。

私の最小限のデータセットは以下のとおりです。

date <- seq.POSIXt(ISOdate(2018, 7, 6), ISOdate(2018,7,16), by = "day")
status <- c("ON","ON","OFF","ON","ON", "ON", "ON", "ON", "ON","ON", "ON")
firstdet <- c("2018-07-07 03:34:58 BST", NA, NA , NA ,               
               NA  , "2018-07-12 01:30:37 BST","2018-07-13 03:15:55 BST", "2018-07-14 00:01:39 BST",
             "2018-07-14 23:46:47 BST" ,"2018-07-15 23:28:16 BST" ,"2018-07-16 23:57:00 BST")
prevVisit <- c(NA, NA, NA,  NA, NA ,"2018-07-07 03:34:58 BST", "2018-07-12 01:30:37 BST",
               "2018-07-13 03:15:55 BST", "2018-07-14 00:01:39 BST",
              "2018-07-14 23:46:47 BST" ,"2018-07-15 23:28:16 BST")

mydf <- data.frame(cbind(as.character(date), status, firstdet, prevVisit))
colnames(mydf)[1] <- "date"

これは次のようになります:

            date       status                firstdet               prevVisit
1  2018-07-06 12:00:00     ON 2018-07-07 03:34:58 BST                    <NA>
2  2018-07-07 12:00:00     ON                    <NA>                    <NA>
3  2018-07-08 12:00:00    OFF                    <NA>                    <NA>
4  2018-07-09 12:00:00     ON                    <NA>                    <NA>
5  2018-07-10 12:00:00     ON                    <NA>                    <NA>
6  2018-07-11 12:00:00     ON 2018-07-12 01:30:37 BST 2018-07-07 03:34:58 BST
7  2018-07-12 12:00:00     ON 2018-07-13 03:15:55 BST 2018-07-12 01:30:37 BST
8  2018-07-13 12:00:00     ON 2018-07-14 00:01:39 BST 2018-07-13 03:15:55 BST
9  2018-07-14 12:00:00     ON 2018-07-14 23:46:47 BST 2018-07-14 00:01:39 BST
10 2018-07-15 12:00:00     ON 2018-07-15 23:28:16 BST 2018-07-14 23:46:47 BST
11 2018-07-16 12:00:00     ON 2018-07-16 23:57:00 BST 2018-07-15 23:28:16 BST

注意:鳥は22:00から03:00の間に夜に訪れるので、日付の列は夜が始まった日を示します。これが、firstdet列の日付が常に日付と一致するとは限らない理由です。

鳥が最後に訪れたのはいつかわからないので、現在の検出と最後の既知の行の間の行のいずれかにステータス「OFF」が含まれる場合は常に、「prevVisit」列を「unknown」で更新したいと思います。例えば:

              date     status                firstdet               prevVisit
1  2018-07-06 12:00:00     ON 2018-07-07 03:34:58 BST                    <NA>
2  2018-07-07 12:00:00     ON                    <NA>                    <NA>
3  2018-07-08 12:00:00    OFF                    <NA>                    <NA>
4  2018-07-09 12:00:00     ON                    <NA>                    <NA>
5  2018-07-10 12:00:00     ON                    <NA>                    <NA>
6  2018-07-11 12:00:00     ON 2018-07-12 01:30:37 BST UNKNOWN
7  2018-07-12 12:00:00     ON 2018-07-13 03:15:55 BST 2018-07-12 01:30:37 BST
8  2018-07-13 12:00:00     ON 2018-07-14 00:01:39 BST 2018-07-13 03:15:55 BST
9  2018-07-14 12:00:00     ON 2018-07-14 23:46:47 BST 2018-07-14 00:01:39 BST
10 2018-07-15 12:00:00     ON 2018-07-15 23:28:16 BST 2018-07-14 23:46:47 BST
11 2018-07-16 12:00:00     ON 2018-07-16 23:57:00 BST 2018-07-15 23:28:16 BST

前の行に基づいて行の値を変更する方法を尋ねる質問をたくさん目にしましたが、これらのどれも前の行の可変範囲を条件としていないようで、私の問題は解決していません。

私が得た最も近いものは、ステータス列の前の行で「OFF」を検索することを望んでいたifelseステートメントです-しかし、これは機能しません:

mydf$prevVisit <- ifelse("OFF" %in% mydf$status[which(mydf$date > mydf$prevVisit & mydf$date < mydf$firstdet)], "unknown", mydf$prevVisit)
r2evans

私はこれを行うためのエレガントでベクトル化可能な方法はないと思います、そしてifelse確かにあなたが望むことをするつもりはありません。これがあなたのために働くかもしれない簡単なハックです。

別のテストを行うためにデータを少し変更しました(ギャップに「不明」を誤って割り当てないようにします)。

x <- read.table(stringsAsFactors=FALSE, header=TRUE, text="
               date status                firstdet               prevVisit
2018-07-06_12:00:00     ON 2018-07-07_03:34:58_BST                      NA
2018-07-07_12:00:00     ON                      NA                      NA
2018-07-08_12:00:00    OFF                      NA                      NA
2018-07-09_12:00:00     ON                      NA                      NA
2018-07-10_12:00:00     ON                      NA                      NA
2018-07-11_12:00:00     ON 2018-07-12_01:30:37_BST 2018-07-07_03:34:58_BST
2018-07-12_12:00:00     ON 2018-07-13_03:15:55_BST 2018-07-12_01:30:37_BST
2018-07-13_12:00:00     ON 2018-07-14_00:01:39_BST 2018-07-13_03:15:55_BST
2018-07-14_12:00:00     ON                      NA 2018-07-14_00:01:39_BST
2018-07-15_12:00:00     ON 2018-07-15_23:28:16_BST 2018-07-14_00:01:39_BST
2018-07-16_12:00:00     ON 2018-07-16_23:57:00_BST 2018-07-15_23:28:16_BST")
x[] <- lapply(x, function(a) gsub("_", " ", a))

x$unknown <- c(FALSE, sapply(seq_len(nrow(x))[-1], function(i) {
  prev <- tail(which(!is.na(x$firstdet[seq_len(i-1)])), n = 1)
  !is.na(x$firstdet[i]) && (!length(prev) || any(x$status[prev:i] == "OFF"))
}))

x$prevVisit <- ifelse(is.na(x$firstdet) | x$unknown, NA, lag(zoo::na.locf(x$firstdet)))
x
#                   date status                firstdet               prevVisit unknown
# 1  2018-07-06 12:00:00     ON 2018-07-07 03:34:58 BST                    <NA>   FALSE
# 2  2018-07-07 12:00:00     ON                    <NA>                    <NA>   FALSE
# 3  2018-07-08 12:00:00    OFF                    <NA>                    <NA>   FALSE
# 4  2018-07-09 12:00:00     ON                    <NA>                    <NA>   FALSE
# 5  2018-07-10 12:00:00     ON                    <NA>                    <NA>   FALSE
# 6  2018-07-11 12:00:00     ON 2018-07-12 01:30:37 BST                    <NA>    TRUE
# 7  2018-07-12 12:00:00     ON 2018-07-13 03:15:55 BST 2018-07-12 01:30:37 BST   FALSE
# 8  2018-07-13 12:00:00     ON 2018-07-14 00:01:39 BST 2018-07-13 03:15:55 BST   FALSE
# 9  2018-07-14 12:00:00     ON                    <NA>                    <NA>   FALSE
# 10 2018-07-15 12:00:00     ON 2018-07-15 23:28:16 BST 2018-07-14 00:01:39 BST   FALSE
# 11 2018-07-16 12:00:00     ON 2018-07-16 23:57:00 BST 2018-07-15 23:28:16 BST   FALSE

(変更されたデータはfirstdet、行9のギャップにもかかわらず、行10が行8を示していることを示しています。)

(あなたが持つことができないので、私は、私は別の列にそれを保管して、あなたは1点でのこれらの実際の日付をするつもりと仮定しています"UNKNOWN"POSIXt列)。あなたが本当にそこにそれを望むなら、あなたは他にすることができます

x$prevVisit <- ifelse(x$unknown, "UNKNOWN", x$prevVisit)

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

名前の列に部分的な値が含まれている場合は、行を保持します

分類Dev

パンダで行に特定の値が含まれている場合は列を削除します

分類Dev

パンダに特定の値が含まれている場合は行を削除します

分類Dev

特定の値が含まれている場合にのみ行を保持する

分類Dev

セルにxより大きい値が含まれている場合は、Rの行を削除します

分類Dev

完全な行にゼロが含まれている場合は、特定の行を削除します

分類Dev

1行にnotepad ++で特定の文字列が含まれている場合は、複数行を削除します

分類Dev

行の残りの部分に(値)が含まれている場合は、ColumnAから値を取得します

分類Dev

特定の列の範囲内の数値を含む行を返しますが、列に特定の数値が含まれている場合のみ

分類Dev

ID 内の行に特定の値が含まれている場合は SELECT

分類Dev

文字列に特定の文字が含まれている場合は、同じ行の空のセルに特定の値を入力します

分類Dev

セルに特定の文字列が含まれている場合は、テーブルの行を削除します

分類Dev

特定の列に特定の値または文字列が含まれている場合、Pythonは行を保持します

分類Dev

セルに特定の値が含まれているが行1には影響しない場合に、行全体を削除する方法

分類Dev

列に名前要素が含まれている場合は、任意の順序で行を選択します

分類Dev

R:行に特定の値が含まれている場合にデータフレームから行を削除する方法(多くの列の場合)

分類Dev

PYTHON行に特定の文字が含まれているかどうかを確認し、含まれていない場合はその行を印刷する方法

分類Dev

行に日付が含まれている場合は、他のセルの値を取得します

分類Dev

行に特定の文字列が含まれている場合は、列を選択します

分類Dev

列に特定の文字列が含まれている場合は、行を削除します

分類Dev

特定の値がテーブルのどの行にもまだ含まれていない場合にのみ、テーブルを更新します

分類Dev

パンダ:次の列の行に特定の値が含まれている場合は、列データを数値で除算します

分類Dev

Excel VBA:列Aの文字列内に数値が含まれている場合は、行を削除します

分類Dev

特定の番号のみが含まれている場合は、sedを使用して行全体を削除します

分類Dev

選択した行に特定の値ng-gridが含まれている場合は、ボタンを無効にします

分類Dev

列に特定の値が含まれている場合は、パンダデータフレームの行をドロップします。

分類Dev

配列に特定の範囲の値が含まれている場合は行をフィルタリング

分類Dev

特定の値(R、dplyr)が含まれている場合は、データフレームから行を削除します

分類Dev

前の出力に特定の文字列が含まれている場合は、コマンドを自動的に再実行する必要があります

Related 関連記事

  1. 1

    名前の列に部分的な値が含まれている場合は、行を保持します

  2. 2

    パンダで行に特定の値が含まれている場合は列を削除します

  3. 3

    パンダに特定の値が含まれている場合は行を削除します

  4. 4

    特定の値が含まれている場合にのみ行を保持する

  5. 5

    セルにxより大きい値が含まれている場合は、Rの行を削除します

  6. 6

    完全な行にゼロが含まれている場合は、特定の行を削除します

  7. 7

    1行にnotepad ++で特定の文字列が含まれている場合は、複数行を削除します

  8. 8

    行の残りの部分に(値)が含まれている場合は、ColumnAから値を取得します

  9. 9

    特定の列の範囲内の数値を含む行を返しますが、列に特定の数値が含まれている場合のみ

  10. 10

    ID 内の行に特定の値が含まれている場合は SELECT

  11. 11

    文字列に特定の文字が含まれている場合は、同じ行の空のセルに特定の値を入力します

  12. 12

    セルに特定の文字列が含まれている場合は、テーブルの行を削除します

  13. 13

    特定の列に特定の値または文字列が含まれている場合、Pythonは行を保持します

  14. 14

    セルに特定の値が含まれているが行1には影響しない場合に、行全体を削除する方法

  15. 15

    列に名前要素が含まれている場合は、任意の順序で行を選択します

  16. 16

    R:行に特定の値が含まれている場合にデータフレームから行を削除する方法(多くの列の場合)

  17. 17

    PYTHON行に特定の文字が含まれているかどうかを確認し、含まれていない場合はその行を印刷する方法

  18. 18

    行に日付が含まれている場合は、他のセルの値を取得します

  19. 19

    行に特定の文字列が含まれている場合は、列を選択します

  20. 20

    列に特定の文字列が含まれている場合は、行を削除します

  21. 21

    特定の値がテーブルのどの行にもまだ含まれていない場合にのみ、テーブルを更新します

  22. 22

    パンダ:次の列の行に特定の値が含まれている場合は、列データを数値で除算します

  23. 23

    Excel VBA:列Aの文字列内に数値が含まれている場合は、行を削除します

  24. 24

    特定の番号のみが含まれている場合は、sedを使用して行全体を削除します

  25. 25

    選択した行に特定の値ng-gridが含まれている場合は、ボタンを無効にします

  26. 26

    列に特定の値が含まれている場合は、パンダデータフレームの行をドロップします。

  27. 27

    配列に特定の範囲の値が含まれている場合は行をフィルタリング

  28. 28

    特定の値(R、dplyr)が含まれている場合は、データフレームから行を削除します

  29. 29

    前の出力に特定の文字列が含まれている場合は、コマンドを自動的に再実行する必要があります

ホットタグ

アーカイブ