具有重复编号的序列

时间:2019-06-17 17:26:51

标签: r

数据

我有一个data.frame,看起来像这样:

df <- data.frame(id = c(1:10),
                 color = c(rep("red", 5), rep("blue", 5)))
df
#>    id color
#> 1   1   red
#> 2   2   red
#> 3   3   red
#> 4   4   red
#> 5   5   red
#> 6   6  blue
#> 7   7  blue
#> 8   8  blue
#> 9   9  blue
#> 10 10  blue

预期结果

我正在尝试创建一个新列,例如pair,该列将对ID分配给每组2个连续ID。例如,我想以一个data.frame结尾,如下所示:

df
#>    id color pair
#> 1   1   red    1
#> 2   2   red    1
#> 3   3   red    2
#> 4   4   red    2
#> 5   5   red    3
#> 6   6  blue    3
#> 7   7  blue    4
#> 8   8  blue    4
#> 9   9  blue    5
#> 10 10  blue    5

当前方法

我想知道的是,是否有比我已经做过的更简洁的方法来实现这一目标。不过,我在seq()文档中没有发现任何运气。这是我目前所拥有的,这给了我所需的输出,但不是很简洁。

df %>% 
  dplyr::mutate(pair = sort(rep(seq(length.out = nrow(df)/2),2)))

#     id  color   pair
# 1   1   red    1
# 2   2   red    1
# 3   3   red    2
# 4   4   red    2
# 5   5   red    3
# 6   6  blue    3
# 7   7  blue    4
# 8   8  blue    4
# 9   9  blue    5
# 10 10  blue    5

除了seq()之外,还有人有其他想法或功能吗?

4 个答案:

答案 0 :(得分:2)

这是一个简单的rep(),来自基数R-

df$pair <- rep(1:nrow(df), each = 2, length.out = nrow(df))

df

   id color pair
1   1   red    1
2   2   red    1
3   3   red    2
4   4   red    2
5   5   red    3
6   6  blue    3
7   7  blue    4
8   8  blue    4
9   9  blue    5
10 10  blue    5

使用dplyr-

df %>% 
  mutate(pair = rep(1:nrow(.), each = 2, length.out = nrow(.)))

答案 1 :(得分:1)

一种可能是:

df %>%
 mutate(pair = gl(n()/2, 2))

   id color pair
1   1   red    1
2   2   red    1
3   3   red    2
4   4   red    2
5   5   red    3
6   6  blue    3
7   7  blue    4
8   8  blue    4
9   9  blue    5
10 10  blue    5

答案 2 :(得分:1)

我们可以使用整数除法

(df$pair <- (1:nrow(df) - 1) %/% 2)
#  [1] 0 0 1 1 2 2 3 3 4 4

也可以很好地推广到更大的群体;例如,

(df$pair <- (1:nrow(df) - 1) %/% 3)
#  [1] 0 0 0 1 1 1 2 2 2 3

答案 3 :(得分:1)

另一个选项

library(dplyr)
df %>%
   mutate(pair = as.integer(gl(n(), 2, n())))
#    id color pair
#1   1   red    1
#2   2   red    1
#3   3   red    2
#4   4   red    2
#5   5   red    3
#6   6  blue    3
#7   7  blue    4
#8   8  blue    4
#9   9  blue    5
#10 10  blue    5

或者使用repcumsum

df %>% 
    mutate(pair = cumsum(rep(c(TRUE, FALSE), length.out = n())))

或更简单的情况是base R

df$pair <- c(TRUE, FALSE)
df$pair <- cumsum(df$pair)