[英]How to reorder rows in R data.table given a specific row order
给定一个 data.table 和向量
fruit.inventory <- data.table(fruit=c('apples', 'oranges', 'bananas'), count=c(5, 16, 23))
fruit.request <- c('pineapple', 'peaches', 'oranges', 'apples')
我怎样才能找回这个
# fruit count
# oranges 16
# apples 5
我知道这可以用这样的东西来完成
setkey(fruit.inventory, fruit)
fruit.subset <- fruit.inventory[fruit.request]
fruit.subset <- fruit.subset[complete.cases(fruit.subset)]
但是,我想使用更短的东西,例如
fruit.subset <- fruit.inventory[fruit %in% fruit.request]
但它不尊重原始向量的顺序。 我知道还有其他一些解决方法,但我一直认为必须有比我上面的方法更简单的方法来做到这一点。
这是使用内部连接的另一个选项:
fruit.inventory[.(fruit.request), on=.(fruit), nomatch=0L]
尝试这个
fruit.inventory[order(na.exclude(match(fruit.inventory$fruit, fruit.request)))]
这使
fruit count
1: oranges 16
2: apples 5
上面的代码可以使用 package dplyr
为
fruit.inventory %>%
pull(fruit) %>%
match(fruit.request) %>%
na.exclude() %>%
order() %>%
fruit.inventory[.]
我的建议可能有点矫枉过正,但实施起来并不难。
我手头总是有一些功能, merge_keeping_order
就是其中之一
merge_keeping_order <- function(x,y,...){
x$orderId <- 1:nrow(x)
a <- merge(x,y,...)
a <- a[order(a$orderId),]
a$orderId <- NULL
a
}
然后你所要做的就是将你的向量转换为 data.table 如下
merge_keeping_order(as.data.table(fruit.request),
fruit.inventory,by.x="fruit.request",by.y="fruit")
## fruit.request count
## 1: oranges 16
## 2: apples 5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.