按 R 中的顺序数据分组
Group by sequential data in 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", "ENSMUSG00000000058",
"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", "ENSMUSG00000000001",
"ENSMUSG00000000058", "ENSMUSG00000000058", "ENSMUSG00000000058",
"ENSMUSG00000000058", "ENSMUSG00000000058"), gene_number = c(4732L,
4733L, 7603L, 7604L, 8246L, 8248L, 9001L)),
class = "data.frame", row.names = c(NA, -7L))
我在 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", "ENSMUSG00000000058",
"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", "ENSMUSG00000000001",
"ENSMUSG00000000058", "ENSMUSG00000000058", "ENSMUSG00000000058",
"ENSMUSG00000000058", "ENSMUSG00000000058"), gene_number = c(4732L,
4733L, 7603L, 7604L, 8246L, 8248L, 9001L)),
class = "data.frame", row.names = c(NA, -7L))