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

时间:2015-01-20 14:36:41

标签: r data.table

以下命令返回一个包含150行的data.table

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

但是,我试图同时进行子集化Sepal.Width > 3,而不是做一个&#34;条件变异&#34;,即我试图做类似的事情

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

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

2 个答案:

答案 0 :(得分:2)

锁定你的电话:

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

这会产生67行。

答案 1 :(得分:0)

你可以尝试

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