我正在尝试创建一个新列,该新列是基于TRUE和FALSE列的条件差异。如果滞后1行为FALSE,则我们应计算与数据行中后来的TRUE行的开头或末尾之间的差,但是如果滞后1行为TRUE,则应重置该差。
我想尽可能多地使用dplyr :: mutate函数。我正在尝试将dplyr :: lag与ifelse()配合使用,但是在条件方面我遇到了困难
dat <- data.frame(logic_col = c(F, F, T, T, F, F, F, T, F),
time_col = c(200, 435, 567, 895, 1012, 1345, 1456, 1700, 1900),
expected_col_unseen = c(200, 435, 567, 328, 117, 450, 561, 805, 200))
答案 0 :(得分:1)
我会把它扔在那里,以防手动计算只是令人困惑:
library(dplyr)
dat %>%
group_by(grp = cumsum(lag(!logic_col, default=FALSE))) %>%
mutate(out = c(time_col[1], diff(time_col))) %>%
ungroup()
# # A tibble: 9 x 5
# logic_col time_col expected_col_unseen grp out
# <lgl> <dbl> <dbl> <int> <dbl>
# 1 FALSE 200 200 0 200
# 2 FALSE 435 435 1 435
# 3 TRUE 567 567 2 567
# 4 TRUE 895 328 2 328
# 5 FALSE 1012 117 2 117
# 6 FALSE 1345 450 3 1345
# 7 FALSE 1456 561 4 1456
# 8 TRUE 1700 805 5 1700
# 9 FALSE 1900 200 5 200
答案 1 :(得分:1)
我们可以使用tidyr
和dplyr
做这样的事情:
library(dplyr)
library(tidyr)
dat %>%
mutate(tmp = lag(logic_col * time_col),
tmp = ifelse(tmp==0, NA,tmp)) %>%
tidyr::fill(tmp, .direction = c("down")) %>%
mutate(out = time_col - ifelse(is.na(tmp), 0,tmp)) %>%
select(-tmp)
#> logic_col time_col expected_col_unseen out
#> 1 FALSE 200 200 200
#> 2 FALSE 435 435 435
#> 3 TRUE 567 567 567
#> 4 TRUE 895 328 328
#> 5 FALSE 1012 117 117
#> 6 FALSE 1345 450 450
#> 7 FALSE 1456 561 561
#> 8 TRUE 1700 805 805
#> 9 FALSE 1900 200 200