删除数据框中不常见的行

Removing infrequent rows in a data frame

假设我有一个非常简单的数据框:

a <- rep(5,30)
b <- rep(4,80)
d <- rep(7,55)

df <- data.frame(Column = c(a,b,d))

什么是最通用的方法来删除所有出现次数少于 60 次的值的行?

我知道你会说"in this case it's just a",但在我的真实数据中有更多的频率,所以我不想一一指定。

我正在考虑编写一个循环,如果 'i' 的 length() 小于 60,这些行将被删除,但也许您有其他想法。提前致谢。

我们创建一个频率 table,然后 subset 行基于 'Column'

中的 'count' 个值
tbl <- table(df$Column) >=60
subset(df, Column %in% names(tbl)[tbl])

ave 来自 base R

df[with(df, ave(Column, Column, FUN = length)>=60),]

或者我们用data.table

library(data.table)
setDT(df)[, .SD[.N >= 60], Column]

或者 data.table 的另一个选项是 .I

setDT(df)[df[, .I[.N >=60], Column]$V1]

使用 dplyr 的解决方案。

library(dplyr)

df2 <- df %>%
  group_by(Column) %>%
  filter(n() >= 60)

或基于 R 的解

uniqueID <- unique(df$Column)
targetID <- sapply(split(df, df$Column), function(x) nrow(x) >= 60)

df2 <- df[df$Column %in% uniqueID[targetID], , drop = FALSE]

使用data.table

library(data.table)
setDT(df)

df[Column %in% df[, .N, by = Column][N >= 60, Column]]

还有一个 答案的变体,它使用连接而不是 %in%:

library(data.table)
setDT(df)
df[df[, .N, by = Column][N >= 60, .(Column)], on = "Column"]