190

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

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
4

6 に答える 6

268

試してみてください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

于 2012-08-15T21:03:58.547 に答える
29

データを照合する必要があるときはいつでも***_join inを使用することを好みます。dplyrこれに対する1つの可能な試み

left_join(data.frame(name=target),df,by="name")

***_joinrequire tbls または data.frameの入力に注意してください。

于 2016-06-23T03:30:00.843 に答える
18

この方法は少し異なります。以前の回答よりも少し柔軟性がありました。arrange順序付き要素にすることで、 などでうまく使うことができます。パッケージの reorder.factor を使用しましたgdata

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()して元の状態に戻します。

于 2015-05-26T11:11:04.133 に答える
2

ライブラリを使用したくない場合や、データに再発がある場合は、whichwithも使用できますsapply

new_order <- sapply(target, function(x,df){which(df$name == x)}, df=df)
df        <- df[new_order,]
于 2020-01-17T19:53:32.600 に答える