删除数据框中不常见的行
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"]
假设我有一个非常简单的数据框:
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'
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"]