R删除数据框中索引nrow小于特定值的行

R delete rows in data frame where nrow of index is smaller than certain value

当具有相同索引的行数小于预先指定的值时,我想删除数据框中的某些行。

> fof.6.5[1:15, 1:3]
   draw Fund.ID Firm.ID
1     1    1667     666
2     1    1572     622
3     1    1392     553
4     1     248      80
5     1    3223     332
6     2    2959    1998
7     2    2659    1561
8     2   14233    2517
9     2   10521   12579
10    2    3742    1045
11    3    9093   10121
12    3   15681   21626
13    3   26371   70170
14    4   27633   52720
15    4   13751     656

在这个例子中,我希望每个索引有 5 行。第三次抽奖(这是我的索引)少于 5 行。如果少于5行,如何删除像第三个那样的抽奖?

下面的代码使得:

library(dplyr)
fof.6.5 <- data.frame(draw = rep(1:4, c(5, 5, 3, 2)),
                      Fun.ID = rnorm(15),
                      Firm.ID = rnorm(15))
fof_filter <- fof.6.5 %>% group_by(draw) %>% mutate(freq = n()) %>%
  filter(freq >= 5) %>% select(-freq)
fof_filter
  • group_by 加入(以某种方式)具有相同 draw
  • 值的配置文件
  • mutate 添加一个新变量 "freq" 来给出配置文件的数量 每组抽奖并重复。
  • filter 只选择那些 "freq" 大于或等于 5
  • 的配置文件
  • select删除"freq" 列因为不再需要

您可以使用 dplyr 执行此操作(假设您的数据位于名为 dt:

的数据框中
dt %>% group_by(draw) %>% filter(n() >= 5) %>% ungroup()

或者您可以使用 tablextabs:

tab <- xtabs(~ draw, dt)

dt[!dt$draw %in% as.numeric(names(which(tab < 5))), ]

这是另一个使用 data.table 的选项。将 'data.frame' 转换为 'data.table'(setDT(df1),按 'draw' 分组,if n行(.N)大于或等于 'n' 然后得到 Data.table (.SD)

的子集
library(data.table)
n <- 5
setDT(df1)[, if(.N >= n) .SD, by = draw]  
#    draw Fund.ID Firm.ID
# 1:    1    1667     666
# 2:    1    1572     622
# 3:    1    1392     553
# 4:    1     248      80
# 5:    1    3223     332
# 6:    2    2959    1998
# 7:    2    2659    1561
# 8:    2   14233    2517
# 9:    2   10521   12579
#10:    2    3742    1045

如果我们只需要 'n' 行数,请使用 head

setDT(df1)[, if(.N >= n) head(.SD, n), by = draw]