通过dplyr在组内应用rep()

时间:2017-04-18 01:34:36

标签: r dplyr rep

我一直试图在群组中复制1和2的二进制输出。 我想要使​​用repdplyr,但我似乎无法理解如何在群组中应用rep。我已经能够通过手动分离分组并指定每组的正确范围来实现。我想知道如何使用rep来应用dplyr

这是一个示例数据。

df <- data.frame(date = c("2017-01-01", "2017-01-01", "2017-01-01", "2017-01-01", "2017-01-01", "2017-01-01", "2017-01-01", "2017-01-02", "2017-01-02", "2017-01-02", "2017-01-02", "2017-01-02", "2017-01-02", "2017-01-02", "2017-01-02", "2017-01-02", "2017-01-02", "2017-01-02"),
                 loc =c("AB", "AB", "AB", "AB", "AB", "AB", "AB", "AB", "CD", "CD", "CD", "CD", "CD", "CD", "CD", "CD", "CD", "CD"),
                 cat = c("a", "a", "a", "b", "b", "b", "b", "b", "c", "c", "c", "c", "c", "d", "d", "d", "d", "d"))

这基本上是我在整个数据集上应用的每个分组运行的代码。

df$type <- rep(1:2,nrow(df)/2)

如您所见,输出忽略列catcat b & d应该从1开始。

         date loc cat type
1  2017-01-01  AB   a    1
2  2017-01-01  AB   a    2
3  2017-01-01  AB   a    1
4  2017-01-01  AB   b    2
5  2017-01-01  AB   b    1
6  2017-01-01  AB   b    2
7  2017-01-01  AB   b    1
8  2017-01-02  AB   b    2
9  2017-01-02  CD   c    1
10 2017-01-02  CD   c    2
11 2017-01-02  CD   c    1
12 2017-01-02  CD   c    2
13 2017-01-02  CD   c    1
14 2017-01-02  CD   d    2
15 2017-01-02  CD   d    1
16 2017-01-02  CD   d    2
17 2017-01-02  CD   d    1

更新: 这是所需的输出。

        date loc cat type
1  2017-01-01  AB   a    1
2  2017-01-01  AB   a    2
3  2017-01-01  AB   a    1
4  2017-01-01  AB   b    1
5  2017-01-01  AB   b    2
6  2017-01-01  AB   b    1
7  2017-01-01  AB   b    2
8  2017-01-02  AB   b    1
9  2017-01-02  CD   c    1
10 2017-01-02  CD   c    2
11 2017-01-02  CD   c    1
12 2017-01-02  CD   c    2
13 2017-01-02  CD   c    1
14 2017-01-02  CD   d    1
15 2017-01-02  CD   d    2
16 2017-01-02  CD   d    1
17 2017-01-02  CD   d    2

1 个答案:

答案 0 :(得分:2)

假设cat是此处唯一相关的分组变量(不是日期和位置),您可以这样做:

library(dplyr)
df = df %>%
    group_by(cat) %>%
    mutate(type = rep(1:2, length.out = length(cat)))
# Output:
         date    loc    cat  type
       <fctr> <fctr> <fctr> <int>
1  2017-01-01     AB      a     1
2  2017-01-01     AB      a     2
3  2017-01-01     AB      a     1
4  2017-01-01     AB      b     1
5  2017-01-01     AB      b     2
6  2017-01-01     AB      b     1
7  2017-01-01     AB      b     2
8  2017-01-02     AB      b     1
9  2017-01-02     CD      c     1
10 2017-01-02     CD      c     2
11 2017-01-02     CD      c     1
12 2017-01-02     CD      c     2
13 2017-01-02     CD      c     1
14 2017-01-02     CD      d     1
15 2017-01-02     CD      d     2
16 2017-01-02     CD      d     1
17 2017-01-02     CD      d     2
18 2017-01-02     CD      d     1