繁体   English   中英

如何在给定特定行顺序的情况下对 R data.table 中的行重新排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM