按照特定顺序的vector对dataframe行进行sorting

有没有一种更简单的方法来确保数据框的行按照我在下面的简短示例中实现的“目标”向量进行sorting?

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元素match的行号,然后按照这个顺序返回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()使其恢复到原来的状态。

每当需要匹配数据时,我宁愿使用***_join dplyr 。 一个可能的尝试

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

请注意, ***_join的input需要tbls或data.frame