r - 如何在组内将第一个值与每个后续值进行比较,直到满足条件

标签 r if-statement dplyr iteration rowwise

所以我在下面的一般结构中有一个数据框:

数据框:

<表类="s-表"> <头> 行数 分组 日期 <正文> 1 一个 2021-05-01 2 一个 2021-05-02 3 一个 2021-05-03 4 b 2021-05-15 5 b 2021-05-17 6 b 2021-05-30 7 b 2021-05-31 8 b 2021-05-31 9 c 2021-05-01 10 c 2021-05-05

我想做的是,在组内,将第一行与下一行进行比较,直到日期之间的差异达到某个阈值,比如 10 天。然后,一旦该行达到阈值,我想针对后续行测试下一行。它看起来像这样:

结果,使用 10 的阈值:

|rownum|group |date       |date diff|
|------|------|-----------|---|        
|1     | a    |2021-05-01 |NA|
|2     | a    |2021-05-02 |1|
|3     | a    |2021-05-03 |2|
|4     | b    |2021-05-15 |NA|
|5     | b    |2021-05-17 |2|
|6     | b    |2021-05-30 |15 (meets criteria, start from row 7 now)|
|7     | b    |2021-05-31 | NA|
|8     | b    |2021-05-31 | 0|
|9     | c    |2021-05-01 | NA|
|10    | c    |2021-05-05 |  4|

所以重申一下,它将一组的第一行与后续行进行比较,直到满足某个阈值。然后从组内的第一个代表开始计数到组内的后续行。差异记录为 datediff。

我已经试过了,但我不知道 sapply 是否可行:

dataframe %>% 
    group_by(group) %>%
    mutate(
        datediff = sapply(date, function(x) {
            all(difftime(dataframe$date,dplyr::lag(dataframe, n = 1, default = NA)))
                }
        )
    )

也试过这个,我觉得更接近我想要的:

for (m in 1:length(dataframe)) {
    dataframe <- dataframe %>% 
        group_by(group) %>% 
        rowwise() %>% 
        mutate(datediff = difftime(dataframe$date,dplyr::lag(date, n = m, default = NA), units="days"))
    }

到目前为止,我还无法获得正确的行向比较,甚至无法实现阈值位。

最佳答案

另一个 tidyverse 解决方案。我们可以使用accumulate 来完成这个任务。 dat 来自 r2evans 的例子。

library(tidyverse)

dat2 <- dat %>%
  group_by(group) %>%
  mutate(diff_lag = as.integer(date - lag(date))) %>%
  mutate(diff = accumulate(diff_lag, function(x, y){
    if (is.na(x)){
      res <- y
    }  else if (x > 10){
      res <- NA
    } else {
      res <- x + y
    }
    return(res)
  })) %>%
  select(-diff_lag) %>%
  ungroup()

dat2
# # A tibble: 10 x 4
#    rownum group date        diff
# <    int> <chr> <date>     <int>
#  1      1 a     2021-05-01    NA
#  2      2 a     2021-05-02     1
#  3      3 a     2021-05-03     2
#  4      4 b     2021-05-15    NA
#  5      5 b     2021-05-17     2
#  6      6 b     2021-05-30    15
#  7      7 b     2021-05-31    NA
#  8      8 b     2021-05-31     0
#  9      9 c     2021-05-01    NA
# 10     10 c     2021-05-05     4

关于r - 如何在组内将第一个值与每个后续值进行比较,直到满足条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69889776/

相关文章:

MYSQL子查询更新后返回多于1行触发器

r - 为什么 summarize() 中的 cur_data() 会返回 df_slice() 错误?

r - 如何使用 dplyr 计算与 rowmean 的比率

r - R 中用拼写正确的单词替换拼写错误的单词的函数?

r - 使用R中的distm()计算数据帧中两个GPS位置之间的距离

r - 在 testthat 中抛出警告而不是错误

java - 为什么即使 "module"和 "sModule"相等,java 代码中的 if 语句也会被跳转

c++ - 在 C++ 中的 if-else block 中声明变量

r - 如何计算负二项式回归模型的预测概率?

r - 在函数中使用可变数量的组