以下の短い例で実装したように、データフレームの行が「ターゲット」ベクトルに従って順序付けられるようにする簡単な方法はありますか?
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")
これはどういうわけか、仕事を成し遂げるには少し複雑すぎるようです。
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
をこの順序で返します。
この方法は少し異なり、以前の回答よりも柔軟性が少し高くなりました。順序付けられた要素にすることで、arrange
などでうまく使用できます。 gdata
パッケージのreorder.factorを使用しました。
df <- data.frame(name=letters[1:4], value=c(rep(TRUE, 2), rep(FALSE, 2)))
target <- c("b", "c", "a", "d")
require(gdata)
df$name <- reorder.factor(df$name, new.order=target)
次に、現在注文されているという事実を使用します。
require(dplyr)
df %>%
arrange(name)
name value
1 b TRUE
2 c FALSE
3 a TRUE
4 d FALSE
元の(アルファベット順)の順序に戻したい場合は、as.character()
を使用して元の状態に戻します。
データを照合する必要があるときはいつでもdplyr
で***_join
を使用することを好みます。これの1つの可能な試み
left_join(data.frame(name=target),df,by="name")
***_join
の入力にはtblsまたはdata.frameが必要であることに注意してください