幾個月前,我問了一個關于如何識別和僅保留遵循特定模式的觀察的問題:如何識別一列中多行的模式,并使用 R 用有關該模式的資訊填充新列?
我想更進一步。在那個問題中,我只是想確定這種模式。現在,如果模式在一個組中出現多次,我如何只保留該模式的最后一次出現。例如,鑒于df1我如何才能實作df2
df1
TIME ID D
12:30:10 2 0
12:30:42 2 0
12:30:59 2 1
12:31:20 2 0
12:31:50 2 0
12:32:11 2 0
12:32:45 2 1
12:33:10 2 1
12:33:33 2 1
12:33:55 2 1
12:34:15 2 0
12:34:30 2 0
12:35:30 2 0
12:36:30 2 0
12:36:45 2 0
12:37:00 2 0
12:38:00 2 1
我想得到以下結果 df2
df2
TIME ID D
12:33:55 2 1
12:34:15 2 0
12:34:30 2 0
12:35:30 2 0
12:36:30 2 0
12:36:45 2 0
12:37:00 2 0
12:38:00 2 1
想法?我上面鏈接的問題中有一些有用的答案,但我現在想縮小范圍。
uj5u.com熱心網友回復:
這是一個我覺得太復雜的基本 R 函式,但它得到了要求的東西。
如果我正確理解了該模式,那么最后一個序列是以 1 還是 0 結尾都沒有關系。 測驗df1b的最后一個序列以 0 結尾。
keep_last_pattern <- function(data, col){
x <- data[[col]]
if(x[length(x)] == 0) x[length(x)] <- 1
#
i <- ave(x, cumsum(x), FUN = \(y) y[1] == 1 & length(y) > 1)
r <- rle(i)
l <- length(r$lengths)
n <- which(as.logical(r$values))
r$values[ n[-length(n)] ] <- 0
r$values[l] <- r$lengths[l] == 1 && r$values[l] == 0
j <- as.logical(inverse.rle(r))
#
data[j, ]
}
keep_last_pattern(df1, "D")
df1b <- df1
df1b[17, "D"] <- 0
keep_last_pattern(df1b, "D")
uj5u.com熱心網友回復:
您想在ID倒數第二個 1 和最后一個 1 之間的每個中排列序列嗎?
這是一個可以應用于每個ID.
library(dplyr)
extract_sequence <- function(x) {
inds <- which(x == 1)
inds[length(inds) - 1]:inds[length(inds)]
}
df %>%
group_by(ID) %>%
slice(extract_sequence(D)) %>%
ungroup
# TIME ID D
# <chr> <int> <int>
#1 12:33:55 2 1
#2 12:34:15 2 0
#3 12:34:30 2 0
#4 12:35:30 2 0
#5 12:36:30 2 0
#6 12:36:45 2 0
#7 12:37:00 2 0
#8 12:38:00 2 1
uj5u.com熱心網友回復:
不確定這會有所幫助,因為尚不清楚您的模式是什么。假設您有這樣的資料,其中一列以某種方式指示該行是否與某個模式匹配:
set.seed(123)
df <- data.frame(
grp = sample(LETTERS[1:3], 10, replace = TRUE),
x = 1:10,
y = c(0,1,0,0,1,1,1,1,1,1),
pattern = rep(c("TRUE", "FALSE"),5)
)
如果目的是只保留pattern == "TRUE"每組的最后一次出現,這可能有效:
df %>%
filter(pattern == "TRUE") %>%
group_by(grp) %>%
slice_tail(.)
# A tibble: 3 x 4
# Groups: grp [3]
grp x y pattern
<chr> <int> <dbl> <chr>
1 A 1 0 TRUE
2 B 9 1 TRUE
3 C 5 1 TRUE
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/333574.html
標籤:r
