Я почти уверен, что есть лучший способ сделать это.
data:
df1<-
data.table::fread("chk_num dtl_name Duration Guest void_type Item_ttl
9707 Americano 45 1 NA 18
9707 Americano 45 1 NA 18
9707 Breakfast-Tea 45 1 NA 18
9707 Breakfast-Tea 45 1 U -18
9707 Café-Latte 45 1 NA 21
9707 Camomille-Tea 45 1 U -18
9707 Camomille-Tea 45 1 NA 18
9707 Earl-Grey-Tea 45 1 U -18
9707 Earl-Grey-Tea 45 1 NA 18
9707 Fresh-Mint-Tea 45 1 U -18
9707 Fresh-Mint-Tea 45 1 NA 18
9707 Green-Tea 45 1 NA 18
9707 Green-Tea 45 1 U -18
9707 Green-Tea 45 1 NA 18
9707 Lemon-Tea 45 1 NA 18
9707 Lemon-Tea 45 1 U -18
9707 Orange-Juice 45 1 NA 24
9707 Pepper-Mint-Tea 45 1 NA 18
9707 Pepper-Mint-Tea 45 1 U -18") %>% setDF
code:
fun1 <- function(x) {
while("U" %in% x$void_type) {
flagU <- min(which(x$void_type == "U"))
delFlagU <- min(which(x$Item_ttl == -x$Item_ttl[flagU]))
x <- x[-c(flagU,delFlagU),]
if(!("U" %in% x$void_type)) {return(x)}
}
return(x)
}
df1 %>% dplyr::group_by(dtl_name, Duration, Guest) %>% dplyr::do(.,fun1(.))
result:
# A tibble: 5 x 6
# Groups: dtl_name, Duration, Guest [4]
# chk_num dtl_name Duration Guest void_type Item_ttl
# <int> <chr> <int> <int> <chr> <int>
#1 9707 Americano 45 1 <NA> 18
#2 9707 Americano 45 1 <NA> 18
#3 9707 Café-Latte 45 1 <NA> 21
#4 9707 Green-Tea 45 1 <NA> 18
#5 9707 Orange-Juice 45 1 <NA> 24
пожалуйста, обратите внимание:
Если у вас есть флаг U, но нет соответствующего «ПАРА», вы застрянете в бесконечном цикле.
Возможно, выхочу немного расширить мой ответ.
Поскольку вы ничего не говорите о своей бизнес-логике, я ничего о ней не знаю.Вы можете адаптировать группировку dplyr::group_by(dtl_name, Duration, Guest)
.Esp с Duration
Я не уверен.
Если вы более data.table
парень:
data.table::setDT(df1)[, fun1(.SD), by = .(dtl_name, Duration, Guest)]