我们说我有一个非常简单的数据框:
a <- rep(5,30)
b <- rep(4,80)
d <- rep(7,55)
df <- data.frame(Column = c(a,b,d))
最强 通用 的方法是删除所有行,其值小于60次?
我知道你可以说&#34;在这种情况下,它只是一个&#34;,但在我的真实数据中有更多的频率,所以我不想指定它们一个之一。
我正在考虑写一个循环,如果长度()是一个&#39; i&#39;小于60,这些行将被删除,但也许你有其他的想法。提前致谢。
答案 0 :(得分:4)
使用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]
答案 1 :(得分:3)
使用data.table
library(data.table)
setDT(df)
df[Column %in% df[, .N, by = Column][N >= 60, Column]]
答案 2 :(得分:2)
我们根据“列”中值的“计数”创建频率table
然后subset
行
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]
答案 3 :(得分:0)
Eric Watt's答案还有一个变体,它使用联接而不是%in%
:
library(data.table)
setDT(df)
df[df[, .N, by = Column][N >= 60, .(Column)], on = "Column"]