有没有一种更简单的方法来确保数据框的行按照我在下面的简短示例中实现的“目标”向量进行排序?
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:
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,并且不包含重复值,它就会起作用。
target
df$name
来自?match:
?match
match returns a vector of the positions of (first) matches of its first argument in its second.
因此match找到与target的元素匹配的行号,然后我们df按该顺序返回。
df