如何根据数据帧中的分组来增加数字距离?

huangapple go评论54阅读模式
英文:

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 &lt;- data.frame(group=c(rep(&#39;a&#39;,3),rep(&#39;b&#39;,3), rep(&#39;c&#39;, 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
&gt; 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 %&gt;% 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) # &gt;= 1.1.0, 否则使用 group_by

df %&gt;% 
  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) # &gt;= 1.1.0, otherwise use group_by

df %&gt;% 
  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 &lt;- 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>



huangapple
  • 本文由 发表于 2023年3月7日 22:17:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/75663155.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定