我有一个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()
之外,还有人有其他想法或功能吗?
答案 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
或者使用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)