添加列时过滤 data.table 中的行

Filtering rows in data.table while adding a column

下面的returns一个data.table有150行

library(data.table)
irisDT <- iris %>% data.table
irisDT[Sepal.Width > 3, Petal.Width_rank := row_number(Petal.Width),
     by = "Species"]

但是,我正在尝试同时进行子集 Sepal.Width > 3,而不是 "conditional mutate",即我正在尝试做类似

的事情
library(dplyr)
iris %>%
  filter(Sepal.Width > 3) %>%
  group_by(Species) %>%
  mutate(Petal.Width_rank = row_number(Petal.Width))

在 data.table 中执行此操作的惯用方法是什么?

你可以试试

DT1 <- setDT(iris)[Sepal.Width >3, c(.SD,list(Petal.Width_rank=
                    row_number(Petal.Width))), by=Species] 

 dim(DT1)
 #[1] 67  6

data.table_1.9.5 中,您还可以使用 frank 和不同的领带选项(正如@docendo discimus 在评论中提到的那样)

 DT2 <- setDT(iris)[Sepal.Width >3, c(.SD, list(Petal.Width_rank=
            frank(Petal.Width, ties.method='first'))), Species]

 dim(DT2)
 #[1] 67  6
 identical(DT1, DT2)
 #[1] TRUE

链接你的电话:

data.table(iris)[
  Sepal.Width > 3
][,
  Petal.Width_rank := rank(Petal.Width, ties="first"), 
  by=Species
][]

这会产生 67 行。