删除数据框中不常见的行

时间:2017-09-18 14:53:47

标签: r dataframe frequency

我们说我有一个非常简单的数据框:

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,这些行将被删除,但也许你有其他的想法。提前致谢。

4 个答案:

答案 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"]