向数据添加数字序列

时间:2018-05-30 22:08:25

标签: r dplyr

嗨我有这样的数据框

df <-data.frame(x=rep(rep(seq(0,3),each=2),2 ),gr=gl(2,8))

     x gr
1    0  1
2    0  1
3    1  1
4    1  1
5    2  1
6    2  1
7    3  1
8    3  1
9    0  2
10   0  2
11   1  2
12   1  2
13   2  2
14   2  2
15   3  2
16   3  2

我想在numberingx

时添加新列==0数字序列

我试过

library(dplyr)
df%>%
  group_by(gr)%>%
  mutate(numbering=seq(2,8,2))

Error in mutate_impl(.data, dots) : 
  Column `numbering` must be length 8 (the group size) or one, not 4

只是侧面注释mutate(numbering=rep(seq(2,8,2),each=2))适用于这个最小的例子,但对于一般情况,最好从0看x值变化!

预期产出

     x gr  numbering
1    0  1   2
2    0  1   2
3    1  1   4
4    1  1   4 
5    2  1   6
6    2  1   6
7    3  1   8
8    3  1   8
9    0  2   2
10   0  2   2
11   1  2   4
12   1  2   4
13   2  2   6
14   2  2   6
15   3  2   8
16   3  2   8

2 个答案:

答案 0 :(得分:2)

你的意思是这样吗?

library(tidyverse);
df %>%
    group_by(gr) %>%
    mutate(numbering = cumsum(c(1, diff(x) != 0)))
## A tibble: 16 x 3
## Groups:   gr [2]
#       x gr   numbering
#   <int> <fct>    <dbl>
# 1     0 1           1.
# 2     0 1           1.
# 3     1 1           2.
# 4     1 1           2.
# 5     2 1           3.
# 6     2 1           3.
# 7     3 1           4.
# 8     3 1           4.
# 9     0 2           1.
#10     0 2           1.
#11     1 2           2.
#12     1 2           2.
#13     2 2           3.
#14     2 2           3.
#15     3 2           4.
#16     3 2           4.

或者,如果您必须有numbering序列2,4,6,...而不是1,2,3,...,那么

df %>%
    group_by(gr) %>%
    mutate(numering = 2 * cumsum(c(1, diff(x) != 0)));
## A tibble: 16 x 3
## Groups:   gr [2]
#       x gr    numering
#   <int> <fct>    <dbl>
# 1     0 1           2.
# 2     0 1           2.
# 3     1 1           4.
# 4     1 1           4.
# 5     2 1           6.
# 6     2 1           6.
# 7     3 1           8.
# 8     3 1           8.
# 9     0 2           2.
#10     0 2           2.
#11     1 2           4.
#12     1 2           4.
#13     2 2           6.
#14     2 2           6.
#15     3 2           8.
#16     3 2           8.

答案 1 :(得分:1)

以下是使用match获取索引然后传递seq值以填充

的选项
df %>% 
   group_by(gr) %>%
   mutate(numbering = seq(2, length.out = n()/2, by = 2)[match(x, unique(x))])
# A tibble: 16 x 3
# Groups:   gr [2]
#       x gr    numbering
#   <int> <fct>     <dbl>
# 1     0 1             2
# 2     0 1             2
# 3     1 1             4
# 4     1 1             4
# 5     2 1             6
# 6     2 1             6
# 7     3 1             8
# 8     3 1             8
# 9     0 2             2
#10     0 2             2
#11     1 2             4
#12     1 2             4
#13     2 2             6
#14     2 2             6
#15     3 2             8
#16     3 2             8