英文:
How to increment a numeric distance based on grouping in a data frame?
问题
在R中,如果给定一个数据框,其中第一列是分组变量,第二列(id)是递增的数值向量,我们可以如何保留具有1个间隔的id
的分组标识?
例如,如果我们有以下数据框:
df <- data.frame(group=c(rep('a',3),rep('b',3), rep('c', 3)),
id=c(1,2,3,4,5,6,7,8,9))
我们希望获得一个新的id列,如下:
1,2,3,5,6,7,9,10,11
你可以使用以下代码来实现这个目标:
library(dplyr)
df_new <- df %>%
group_by(group) %>%
mutate(id = id - min(id) + 1) %>%
group_by(group) %>%
mutate(id = id + cumsum(c(TRUE, diff(id) != 1)))
df_new <- ungroup(df_new)
这将得到你所期望的新数据框df_new
。
希望这对你有帮助。
英文:
In R, given a data frame with the first column as a grouping variable and the second column (id) as an incrementing numeric vector, how can we keep group id with 1 gap in id
?
For example, if we have the following data frame:
df <- data.frame(group=c(rep('a',3),rep('b',3), rep('c', 3)),
id=c(1,2,3,4,5,6,7,8,9))
we want to get a new id column as:
1,2,3,5,6,7,9,10,11
> df_new
group id
1 a 1
2 a 2
3 a 3
4 b 5
5 b 6
6 b 7
7 c 9
8 c 10
9 c 11
答案1
得分: 1
我们可以使用data.table::rleid()
或dplyr::consecutive_id()
(需要dplyr版本>= 1.1.0)来获取ID块,然后进行操作。
library(data.table)
library(tidyverse)
df %>% mutate(id2 = rleid(group) + id - 1)
group id id2
1 a 1 1
2 a 2 2
3 a 3 3
4 b 4 5
5 b 5 6
6 b 6 7
7 c 7 9
8 c 8 10
9 c 9 11
英文:
We can use data.table::rleid()
or dplyr::consecutive_id()
(requires dplyr version >= 1.1.0) to get blocks of id, then manipulate there.
library(data.table)
library(tidyverse)
df %>% mutate(id2 = rleid(group) + id - 1)
group id id2
1 a 1 1
2 a 2 2
3 a 3 3
4 b 4 5
5 b 5 6
6 b 6 7
7 c 7 9
8 c 8 10
9 c 9 11
答案2
得分: 1
使用 cur_group_id
在按 group 分组时
library(dplyr) # >= 1.1.0, 否则使用 group_by
df %>%
mutate(id = id + cur_group_id() - 1, .by = group)
group id
1 a 1
2 a 2
3 a 3
4 b 5
5 b 6
6 b 7
7 c 9
8 c 10
9 c 11
英文:
Using cur_group_id
while grouping by group
library(dplyr) # >= 1.1.0, otherwise use group_by
df %>%
mutate(id = id + cur_group_id() - 1, .by = group)
group id
1 a 1
2 a 2
3 a 3
4 b 5
5 b 6
6 b 7
7 c 9
8 c 10
9 c 11
答案3
得分: 1
使用 base R
df$id <- with(df, with(rle(group), rep(seq_along(values), lengths)) + id - 1)
df$id
[1] 1 2 3 5 6 7 9 10 11
英文:
Using base R
df$id <- with(df, with(rle(group), rep(seq_along(values), lengths)) + id - 1)
df$id
[1] 1 2 3 5 6 7 9 10 11
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论