R 重复编号序列 资料

R 重复编号序列 资料,r,R,我有一个data.frame,看起来像这样: df id颜色 #>11红色 #>2红色 #>3 3红色 #>4红色 #>5红色 #>6蓝色 #>7蓝色 #>8蓝色 #>9蓝色 #>10蓝色 预期结果 我试图创建一个新列,比如说pair,它为每组2个连续ID分配一个pairID。例如,我想以一个data.frame结尾,它看起来像: df #>id颜色对 #>1红色1 #>2红色1 #>3红色2 #>4红色2 #>5红色3 #>6蓝色3 #>7蓝色4 #>8蓝色4 #>9蓝色5 #>10蓝色5

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

df id颜色
#>11红色
#>2红色
#>3 3红色
#>4红色
#>5红色
#>6蓝色
#>7蓝色
#>8蓝色
#>9蓝色
#>10蓝色
预期结果 我试图创建一个新列,比如说
pair
,它为每组2个连续ID分配一个pairID。例如,我想以一个
data.frame
结尾,它看起来像:

df
#>id颜色对
#>1红色1
#>2红色1
#>3红色2
#>4红色2
#>5红色3
#>6蓝色3
#>7蓝色4
#>8蓝色4
#>9蓝色5
#>10蓝色5
现行方法 我想知道的是,是否有比我现在所做的更简洁的方法来实现这一点。不过,我已经很幸运地浏览了
seq()
文档。这是我目前拥有的,它给了我想要的输出,但不是很简洁

df%>%
dplyr::mutate(pair=sort(rep(seq(length.out=nrow(df)/2),2)))
#id颜色对
#1红色1
#2红色1
#3红色2
#4红色2
#5红色3
#6蓝色3
#7蓝色4
#8蓝色4
#9蓝色5
#10蓝色5

除了
seq()

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

我们可以使用整数除法

(df$pair <- (1:nrow(df) - 1) %/% 2)
#  [1] 0 0 1 1 2 2 3 3 4 4
(df$pair另一个选项

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

或者使用
rep
cumsum

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

或者使用
base R

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

df$pair这里有一个来自base R的简单with
rep()-

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

非常感谢您的众多解决方案!我已经记下了它们,以备将来使用。
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
df %>% 
  mutate(pair = rep(1:nrow(.), each = 2, length.out = nrow(.)))