1. ホーム
  2. r

[解決済み] データフレームの行を特定の順番でベクトルに従って並べる

2022-04-14 08:16:51

質問

以下の短い例で実装したように、データフレームの行が "ターゲット" ベクトルに従って順序付けされることを確認する簡単な方法はありますか?

df <- data.frame(name = letters[1:4], value = c(rep(TRUE, 2), rep(FALSE, 2)))

df
#   name value
# 1    a  TRUE
# 2    b  TRUE
# 3    c FALSE
# 4    d FALSE

target <- c("b", "c", "a", "d")

これはどういうわけか、仕事をこなすにはちょっと"complete"しすぎのような気がします。

idx <- sapply(target, function(x) {
    which(df$name == x)
})
df <- df[idx,]
rownames(df) <- NULL

df 
#   name value
# 1    b  TRUE
# 2    c FALSE
# 3    a  TRUE
# 4    d FALSE

解決方法は?

試す match :

df <- data.frame(name=letters[1:4], value=c(rep(TRUE, 2), rep(FALSE, 2)))
target <- c("b", "c", "a", "d")
df[match(target, df$name),]

  name value
2    b  TRUE
3    c FALSE
1    a  TRUE
4    d FALSE

を使用する限り、動作します。 target と全く同じ要素を含んでいます。 df$name どちらも重複した値を含んでいません。

から ?match :

match returns a vector of the positions of (first) matches of its first argument 
in its second.

したがって match に一致する行番号を探します。 target を返し、その後に df をこの順番で実行します。