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 列。
我们需要提取“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)