在我下面的陈述中:

  1. RSA是要分析的过程的输出,其结果将被分组.
  2. RSA组有不同的观察天数范围(datenum天).
  3. var1的变化频率较低,但每一次都连续观察8天.
  4. RSA组将在var1组内按顺序编号;当遇到新的var1时,RSA组编号重新开始.
  5. idx_objective是我要找的指数.

Reprex:

var1 <- c("aaa", "aaa", "aaa", "aaa", "aaa", "aaa", "aaa", "aaa", "bbb", "bbb", "bbb", "bbb", "bbb", "bbb", "bbb", "bbb", "ccc", "ccc", "ccc", "ccc", "ccc", "ccc", "ccc", "ccc", "ddd", "ddd", "ddd", "ddd", "ddd", "ddd", "ddd", "ddd")
RSA <- c(1,1,1,0,-1,-1,0,-1, 
         0,0,0,-1,-1,-1,1,1,
        -1,-1,0,1,1,-1,-1,1, 
        1,-1,-1,1,1,0,-1,1)
idx_objective <- c(1,1,1,2,3,3,4,5, 
                   1,1,1,2,2,2,3,3, 
                   1,1,2,3,3,4,4,5, 
                   1,2,2,3,3,4,5,6)
objective.df <- data.frame(var1, RSA, idx_objective) %>%
  group_by(var1) %>%
  mutate  (datenum = 1:n()) %>%
  relocate (datenum, .after = var1)

我审阅了许多看似相似的SO帖子.

1dplyr: group variables then assign unique names based on unique grouping

围绕着对Cumsum的正确使用,我认为我是正确使用的

[https://stackoverflow.com/questions/40519129/how-to-assign-unique-id-for-group-of-duplicates]

[2]How to divide between groups of rows using dplyr

后两个似乎不适用;另外两个在以下内容中引用:

Approach #1: using a change flag and cumsum

objective.try1 <- objective.df %>%
  group_by(var1) %>%
  mutate(chg_flg = ifelse(lag(RSA) != RSA, 1, 0) %>%
    coalesce(0)) %>%
  relocate(chg_flg, .after = RSA) %>%
  relocate (datenum, .after var1) %>%
  group_by(var1, chg_flg) %>%
  mutate (idx_objective_try = cumsum(chg_flg) +1) %>%

结果:

objective.try1 <- c(1, 1, 1, 2, 3, 1, 4, 5, 1, 1, 1, 2, 1, 1, 3, 1, 1, 2, 3, 1, 4, 1, 5, 1, 2, 1, 3, 1, 4, 5, 6)
objective.df <- data.frame(var1, RSA, idx_objective, objective.try1 %>%
  group_by(var1) %>%
  mutate (datenum = 1: n()) %>%
  relocate(datenum, .after = var1)

objective.try1的观察:行1-5工作,但行6再次错误地重新开始idx编号,但随后恢复正确地反映chg_flg,直到行13和14,此时idx编号再次错误地重新开始,但随后再次恢复对一行的正确,直到行16、21、23、27和29再次错误.

例如,按照第6行的逻辑--前idx_objective_try(第5行)是3,第6行的chg_flg值是0,所以idx_objecitve_try应该是正确的值3.为什么不是呢?

Approach #2: Using match and duplicated:

objective.try2 <- objective.df %>%
  group_by(var1) %>%. # var1 corresponds to "prop" in the SO post (both the slower moving variables)
  mutate(well_rep1 = match(RSA, unique(RSA)), # "RSA" corresponds to "well" in the SO post (both the faster changing variables)
  well_rep2 = cumsum(!duplicated(RSA))) # approach similar to above

objective.try2行观察:大多数行都可以工作,但也有一些行不工作,尽管不工作的行与第一次try 时的行不同.

如果有人能指出我做错了什么,我将不胜感激.

推荐答案

聚焦于var1中的第一个组"AAA",您将获得以下列RSA年的数据:

objective.df[objective.df$var1 == "aaa", "RSA"]
    RSA
  <dbl>
1     1
2     1
3     1
4     0
5    -1
6    -1
7     0
8    -1

如果对此使用diff函数来获取一个值与另一个值之间的差异,您将得到RSA中的8个数据元素"aaa"的7个差异.换句话说,如果您有一个长度为"n"的向量,您将在最后返回"n-1"值(不更改参数).

由于我们要添加一个新的列new_id_objective,因此需要为该组包括8个值,而不是7个.组合c将帮助创建新列的向量,将初始数字与diff的7个差值组合在一起,总共为8个.

因此,对于"aaa",diff将返回0、0、-1、-1、0、1、-1.将这些值与0(!= 0)进行比较,判断结果为真或假.值为TRUE的cumsum将递增计数器.换句话说,当连续的行值之间存在差异(向上或向下,或者非零值)时,值new_id_objective将逐行增加.

在本例中,我们使用了带有初始值1的Combine c.请注意,我们可以使用任何非零的数字(而在本例中,我们使用1,我们可以使用5、c、-10或任何非零的数字).通过这样做,第一次求值将为真(不等于零),new_id_objective计数器值将从0+1=1开始.否则,如果您确实try 使用零,即c(0, diff(RSA)) != 0,它将求值为假,累计和将从0开始,而不是1.

如果这有帮助,请告诉我.

library(tidyverse)

objective.df %>% 
  group_by(var1) %>% 
  mutate(new_id_objective = cumsum(c(1, diff(RSA)) != 0))

Output

   var1  datenum   RSA idx_objective new_id_objective
   <chr>   <int> <dbl>         <dbl>            <int>
 1 aaa         1     1             1                1
 2 aaa         2     1             1                1
 3 aaa         3     1             1                1
 4 aaa         4     0             2                2
 5 aaa         5    -1             3                3
 6 aaa         6    -1             3                3
 7 aaa         7     0             4                4
 8 aaa         8    -1             5                5
 9 bbb         1     0             1                1
10 bbb         2     0             1                1
# … with 22 more rows

R相关问答推荐

根据固定值范围在tible中添加新行

列出用m n个值替换来绘制n个数字的所有方法(i.o.w.:R中大小为n的集合的所有划分为m个不同子集)

使用ggplot 2根据R中的类别排列Likert比例gplot

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

在for循环中转换rabrame

S用事件解决物质平衡问题

将包含卷的底部25%的组拆分为2行

从BRM预测价值

以更少间隔的较小表中的聚合离散频率表

我如何使用循环来编写冗余的Rmarkdown脚本?

如果条件匹配,则使用Mariate粘贴列名

错误包arrowR:READ_PARQUET/OPEN_DATASET&QOT;无法反序列化SARIFT:TProtocolException:超出大小限制&Quot;

R仅当存在列时才发生变异

通过R:文件名未正确写入[已解决]将.nc文件转换和导出为.tif文件

如何使用循环从R中的聚合函数创建列,而不会在名称中给出&q;$&q;?

如何创建直方图与对齐的每月箱?

汇总数据:在跨越()all_of()Dynamic_list_of_vars=>;所选内容不能有缺失值的汇总()中出错

如何在给定的环境中找到函数的函数参数?

如何在用`{{ }}`创建的变量上使用整洁 Select ?

根据单个条件变异多个列