以下命令返回一个包含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中执行此操作的惯用方法是什么?
答案 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