使用 data.table 删除 R 中的行

Mee*_*sha 2 r data.table

df:-

Date    Name  Salary 
Q1 2015 ABC   $10
Q2 2015 ABC   $11
Q3 2015 ABC   $15
Q1 2015 XYZ   $25
Q2 2015 XYZ   $20
Run Code Online (Sandbox Code Playgroud)

我想从总频率小于 3 的数据中删除行。例如,XYZ 的频率为 2,所以我想删除第 4 行和第 5 行。

test <- setDT(df)[,.I[.N>2],by=Name]
Run Code Online (Sandbox Code Playgroud)

输出:-

> test
   Name V1
1:  ABC  1
2:  ABC  2
3:  ABC  3
Run Code Online (Sandbox Code Playgroud)

过滤正确完成,但我没有得到整个数据集,我只得到输出中的 Name 列。

akr*_*run 5

我们需要提取“V1”列并将其用作“i”中的行索引以对行进行子集化。

setDT(df)[df[,.I[.N>2],by=Name]$V1]
#       Date Name Salary
#1: Q1 2015  ABC    $10
#2: Q2 2015  ABC    $11
#3: Q3 2015  ABC    $15
Run Code Online (Sandbox Code Playgroud)

或者带有if和的简洁选项.SD

setDT(df)[, if(.N >2) .SD, by = Name]
#    Name    Date Salary
#1:  ABC Q1 2015    $10
#2:  ABC Q2 2015    $11
#3:  ABC Q3 2015    $15
Run Code Online (Sandbox Code Playgroud)

以防万一,如果我们需要一个dplyr方法

library(dplyr)
df %>%
   group_by(Name) %>%
   filter(n() >2 )
#      Date  Name Salary
#     <chr> <chr>  <chr>
#1 Q1 2015   ABC    $10
#2 Q2 2015   ABC    $11
#3 Q3 2015   ABC    $15
Run Code Online (Sandbox Code Playgroud)

或者使用base R,我们可以有多种选择,其中一个带有ave

df[with(df, ave(seq_along(Name), Name, FUN = length)>2),]
Run Code Online (Sandbox Code Playgroud)

或使用 table

tbl <- table(df$Name)> 2
subset(df, Name %in% names(tbl)[tbl])
Run Code Online (Sandbox Code Playgroud)

  • 我怀疑`.SD` 方式现在是有效的,根据 https://github.com/Rdatatable/data.table/issues/735 中的第一项,我想我可能会误读,不过......我会很想知道这是否成立。 (2认同)