個々の鳥が巣を訪れたときに記録する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)
私はこれを行うためのエレガントでベクトル化可能な方法はないと思います、そして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]
コメントを追加