观察值小于特定值-R 的水平下降因子

Dropping factors which levels have observations smaller than a specific value-R

让我有这样的数据框(df1),其中包含以下因素:

factor1  factor2  factor3
-------  -------  -------
d        a         x
d        a         x
b        a         x
b        c         x
b        c         y
c        c         y
c        n         y
c        n         y
c        n         y

我想从此数据框中删除其中一个元素的观察值少于 3 个的因素。

在此数据框中,factor1 有 3 个级别(d、b 和 c)。但是 d 级别的频率为 2。所以我想从此数据框中删除 factor1。

结果数据框应为:

factor2  factor3
-------  -------
a         x
a         x
a         x
c         x
c         y
c         y
n         y
n         y
n         y

我如何使用 R 执行此操作?我会很高兴任何帮助。非常感谢。

这是你想要的吗?

df <- data.frame(col1=rep(letters[1:4], each=3),
                 col2=rep(letters[1:2], each=6),
                 col3=rep(letters[1:3], each=4))

ddf[, sapply(df, function(x) min(nlevels(x)) > 2)]

您可以尝试使用 lapplytable:

df1[, lapply(c(1,2,3), FUN = function(x) min(table(df1[,x]))) >= 3]

而且,更通用一点:

df1[, lapply(1:ncol(df1), FUN = function(x) min(table(df1[,x]))) >= 3]

我会创建一个快速帮助函数,通过快速调用 table() 检查每个级别存在多少个唯一实例——查看 table(df$fac1) 以了解其工作原理。请注意,这不是很可靠,但应该可以帮助您入门:

df <- data.frame(fac1 = factor(c("d", "d", "b", "b", "b", "c", "c", "c", "c")),
                 fac2 = factor(c("a", "a", "a", "c", "c", "c", "n", "n", "n")),
                 fac3 = factor(c(rep("x", 4), rep("y", 5))),
                 other = 1:9)

at_least_three_instances <- function(column) {
  if (is.factor(column)) {
    if (min(table(column)) > 2) {
      return(TRUE)
    } else {
      return(FALSE)
    }
  } else {
    return(TRUE)
  }
}

df[unlist(lapply(df, at_least_three_instances))]

我们可以使用Filter

Filter(function(x) min(nlevels(x))>2, df1)

(基于其中一篇点赞帖子的结果)

或者也可以

Filter(function(x) min(tabulate(x))>2, df1)