微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按 R 中的顺序数据分组 数据

如何解决按 R 中的顺序数据分组 数据

我在 R 中有以下数据框:

gene_name           gene_number
ENSMUSG00000000001  4732
ENSMUSG00000000001  4733
ENSMUSG00000000058  7603
ENSMUSG00000000058  7604
ENSMUSG00000000058  8246
ENSMUSG00000000058  8248
ENSMUSG00000000058  9001

数据按gene_name列分组,gene_number按其他参数排序(与问题无关)。 我想根据 gene_number 对数据进行分组。在每个组内,如果 gene_number 中的值不是连续/连续的,或者以下行之间的最大差异为 2,我想对数据进行子分组。 如果只有 1 个值没有序列值,我想删除它。

我想要一个指定新组的新列。

例如,在上面的数据中:

ENSMUSG00000000001  4732  1
ENSMUSG00000000001  4733  1
ENSMUSG00000000058  7603  2
ENSMUSG00000000058  7604  2 
ENSMUSG00000000058  8246  3
ENSMUSG00000000058  8248  3

谢谢!

解决方法

这是一个 dplyr 选项 -

library(dplyr)

df %>%
  group_by(gene_name) %>%
  mutate(grp =  gene_number - lag(gene_number,default = 0) > 2) %>%
  group_by(grp = cumsum(grp)) %>%
  filter(n() > 1) %>%
  ungroup
  
#  gene_name          gene_number   grp
#  <chr>                    <int> <int>
#1 ENSMUSG00000000001        4732     1
#2 ENSMUSG00000000001        4733     1
#3 ENSMUSG00000000058        7603     2
#4 ENSMUSG00000000058        7604     2
#5 ENSMUSG00000000058        8246     3
#6 ENSMUSG00000000058        8248     3

对于每个 gene_name,用前一个值减去当前的 gene_number 值,如果差值大于 2,则增加组计数。如果组中只有一行,则删除该行。

数据

df <- structure(list(gene_name = c("ENSMUSG00000000001","ENSMUSG00000000001","ENSMUSG00000000058","ENSMUSG00000000058"),gene_number = c(4732L,4733L,7603L,7604L,8246L,8248L,9001L)),class = "data.frame",row.names = c(NA,-7L))
,

使用 data.table

library(data.table)
setDT(df)[,grp := c(TRUE,diff(gene_number) > 2),gene_name][,grp := cumsum(grp)][,.SD[.N>1],grp]
   grp          gene_name gene_number
1:   1 ENSMUSG00000000001        4732
2:   1 ENSMUSG00000000001        4733
3:   2 ENSMUSG00000000058        7603
4:   2 ENSMUSG00000000058        7604
5:   3 ENSMUSG00000000058        8246
6:   3 ENSMUSG00000000058        8248

数据

df <- structure(list(gene_name = c("ENSMUSG00000000001",-7L))

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