当前位置: 首页 > 知识库问答 >
问题:

如何在 R 中为连续模式标记组?

浦泳
2023-03-14

我正在尝试为每个组标记。这是数据集。

   group
1    p01
2    p01
3    p01
4    p01
5    p02
6    p01
7    p01
8    p01
9    p02
10   p02
11   p01
12   p01

结构(列表(组=结构(c(1L,1L,2L,1LL,2L、1L,4L,1L,1L、2L,2L,2L),.Label=c(“p01”,“p02”),class=“factor”)),class=“data.frame”,行。名称=c(NA,-12L))

这是预期表。在p01的情况下,预期列是从1-4中的1,然后是从6-8中的2,从11-12中的3,用于考虑连续模式。

   group new_group
1    p01         1
2    p01         1
3    p01         1
4    p01         1
5    p02         1
6    p01         2
7    p01         2
8    p01         2
9    p02         2
10   p02         2
11   p01         3
12   p01         3

如何在 r 中使用 dplyr 做到这一点?

共有3个答案

慕容典
2023-03-14

我们可以用row_number()创建一个列,每当行的差值大于1时,为每个递增计数器。

library(dplyr)

df %>%
  mutate(row = row_number()) %>%
  group_by(group) %>%
  mutate(new_group = cumsum(row - lag(row, default = first(row)) > 1) + 1) %>%
  select(-row)

#   group new_group
#   <fct>     <dbl>
# 1 p01           1
# 2 p01           1
# 3 p01           1
# 4 p01           1
# 5 p02           1
# 6 p01           2
# 7 p01           2
# 8 p01           2
# 9 p02           2
#10 p02           2
#11 p01           3
#12 p01           3

或者使用差异更短一点

df %>%
  mutate(row = row_number()) %>%
  group_by(group) %>%
  mutate(new_group = cumsum(c(TRUE, diff(row) > 1))) %>%
  select(-row)
王刚毅
2023-03-14

是这样吗?

x %>%
  mutate(new_group = cumsum(group == "p01" & lag(group != "p01", default = TRUE)))
#    group new_group
# 1    p01         1
# 2    p01         1
# 3    p01         1
# 4    p01         1
# 5    p02         1
# 6    p01         2
# 7    p01         2
# 8    p01         2
# 9    p02         2
# 10   p02         2
# 11   p01         3
# 12   p01         3
公西光华
2023-03-14

另一种可能性:

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

df <- structure(list(group = structure(c(1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L), .Label = c("p01", "p02"), class = "factor")), class = "data.frame", row.names = c(NA, -12L))

df %>%
  mutate(new_group = with(rle(as.integer(group)), rep(seq_along(lengths), lengths))) %>%
  group_by(group) %>%
  transmute(new_group = as.integer(as.factor(new_group))) %>%
  ungroup()
#> # A tibble: 12 x 2
#>    group new_group
#>    <fct>     <int>
#>  1 p01           1
#>  2 p01           1
#>  3 p01           1
#>  4 p01           1
#>  5 p02           1
#>  6 p01           2
#>  7 p01           2
#>  8 p01           2
#>  9 p02           2
#> 10 p02           2
#> 11 p01           3
#> 12 p01           3

< sup >由reprex包(v0.3.0)于2019-08-12创建

 类似资料:
  • 问题内容: 我有一张桌子,看起来像: 它是按组和日期排序的。我想要一个额外的列来显示每个组的 连续 颜色’R’的顺序号。 要求的输出: 我试图将窗口函数与按组和颜色列进行分区一起使用,但它返回的输出在下面是不正确的。 错误的查询和输出: 我想知道它是否可以在SQL中使用,还是应该切换到另一种语言(例如Python)? 问题答案: 这是使用窗口功能可以完成的方式。首先,我们创建一个CTE,该CTE具

  • 问题内容: 我正在尝试让Python解析如下的Avro模式… …并且出现以下异常: 我究竟做错了什么? 问题答案: 根据网络上的其他消息来源,我将重写您的第二个地址定义:

  • 我使用sqlfile模式。在一个sql文件中,我编写了几个变更集: 当我像这样执行该文件时: 如何用相同的标签标记所有的3行? 谢谢

  • 问题内容: 我如何返回在MySQL中实际上是“连续的” GROUP BY。换句话说,GROUP BY是否尊重记录集的顺序? 例如,从下表中,col1是唯一的有序索引: 返回: 但我需要返回以下内容: 问题答案: 采用: 这里的关键是创建一个允许分组的人为值。 以前,更正了Guffa的答案:

  • 问题内容: 我正在阅读http://docs.python.org/2/library/re.html。按此在蟒re.compile(以下简称“R” - [R “模式标志”)是指原始字符串符号: 解决方案是将Python的原始字符串表示法用于正则表达式模式。反斜杠在以’r’开头的字符串文字中不会以任何特殊方式处理。所以r“ \ n”是一个包含’'和’n’的两个字符的字符串,而“ \ n”是一个包含

  • 问题内容: 我是webworker的新手,但我设法将xmlhttprequest发送到我的rest api,并且得到了json。但我想一次又一次(循环)发送此请求,直到页面处于活动状态。我实际上想实时显示值。我想制作一个简单的Web应用程序,在其中将数据插入数据库时​​,我的Webworker应该显示该数据而不刷新页面。有没有更好的方法可以做到这一点。请帮助我。对不起,英语不好。 问题答案: 您可