私は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
、2つの連続するIDの各グループにペア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()
が仕事をしますか?
別のオプション
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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加