R:每次新序列开始时如何开始新的 sub_id

如何解决R:每次新序列开始时如何开始新的 sub_id

假设我有如下数据:

tibble(
    A = c(1,2,3,4,5),B = c(1,1,1),)

# A tibble: 16 x 2
       A     B
   <dbl> <dbl>
 1     1     1
 2     2     1
 3     2     2
 4     2     1
 5     2     2
 6     2     3
 7     3     1
 8     3     2
 9     3     1
10     3     1
11     4     1
12     4     2
13     4     3
14     4     4
15     4     1
16     5     1

每次在变量 A 定义的组内开始新序列时,我如何创建 sub_id,即,

tibble(
    A = c(1,sub_id = c(1,1)
)
# A tibble: 16 x 3
       A     B sub_id
   <dbl> <dbl>  <dbl>
 1     1     1      1
 2     2     1      1
 3     2     2      1
 4     2     1      2
 5     2     2      2
 6     2     3      2
 7     3     1      1
 8     3     2      1
 9     3     1      2
10     3     1      3
11     4     1      1
12     4     2      1
13     4     3      1
14     4     4      1
15     4     1      2
16     5     1      1

希望这是明确的。我想我在追求一种与 row_number 的倒数

提前致谢,

詹姆斯。

解决方法

你已经准备好了“成分”。

(i) 对于每组 A 列 (ii) 检查新序列是否开始

以下内容基于{dplyr}。出于演示目的,我创建了一个额外的列/变量来显示“开始条件”。您可以将其合并为一次调用。

我使用的事实是,对 TRUE/FALSE 求和将 TRUE 编码为 1。如果这对您来说不明显,您可以使用 as.numeric(B == 1)

library(dplyr)
library(tibble)

# load example data
df <- tibble(
    A = c(1,2,3,4,5),B = c(1,1,1),sub_id = c(1,1)
)

# perform group-wise operations 
df %>% 
   group_by(A) %>% 

   mutate(
# --------------- highlight start of new sequence --------------
      start = B == 1
# --------------- create cumsum over TRUEs----------------------,sub_id2 = cumsum(start)
)

这会产生您要查找的内容:

# A tibble: 16 x 5
# Groups:   A [5]
       A     B sub_id start sub_id2
   <dbl> <dbl>  <dbl> <lgl>   <int>
 1     1     1      1 TRUE        1
 2     2     1      1 TRUE        1
 3     2     2      1 FALSE       1
 4     2     1      2 TRUE        2
 5     2     2      2 FALSE       2
 6     2     3      2 FALSE       2
 7     3     1      1 TRUE        1
 8     3     2      1 FALSE       1
 9     3     1      2 TRUE        2
10     3     1      3 TRUE        3
11     4     1      1 TRUE        1
12     4     2      1 FALSE       1
13     4     3      1 FALSE       1
14     4     4      1 FALSE       1
15     4     1      2 TRUE        2
16     5     1      1 TRUE        1
,

使用 base R

df$sub_id <- with(df,ave(B ==1,A,FUN = cumsum))
,

我们可以使用 group_bycumsum

library(dplyr)

df %>%
  group_by(A) %>%
  mutate(sub_id = cumsum(B==1)

输出:

# Groups:   A [5]
       A     B sub_id
   <dbl> <dbl>  <int>
 1     1     1      1
 2     2     1      1
 3     2     2      1
 4     2     1      2
 5     2     2      2
 6     2     3      2
 7     3     1      1
 8     3     2      1
 9     3     1      2
10     3     1      3
11     4     1      1
12     4     2      1
13     4     3      1
14     4     4      1
15     4     1      2
16     5     1      1
,

data.table 选项

> setDT(df)[,sub_id := cumsum(B == 1),A][]
    A B sub_id
 1: 1 1      1
 2: 2 1      1
 3: 2 2      1
 4: 2 1      2
 5: 2 2      2
 6: 2 3      2
 7: 3 1      1
 8: 3 2      1
 9: 3 1      2
10: 3 1      3
11: 4 1      1
12: 4 2      1
13: 4 3      1
14: 4 4      1
15: 4 1      2
16: 5 1      1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?