按照特定顺序的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