【问题标题】:Dropping factors which levels have observations smaller than a specific value-R删除水平观察值小于特定值-R 的因子
【发布时间】:2016-07-19 00:08:11
【问题描述】:

让我有这样的数据框(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 来做到这一点?我会很高兴得到任何帮助。非常感谢。

【问题讨论】:

    标签: r filtering r-factor


    【解决方案1】:

    我们可以使用Filter

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

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

    或者也可以

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

    【讨论】:

    • 这是最好的答案。最快、最紧凑。您应该注意 nlevels() 在所有非因子变量上安全地返回 0。另外,如果我们想让这个规范化,应该参数化:Filter(function(x, max.nlevels=2) ...
    【解决方案2】:

    这就是你想要的吗?

    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)]
    

    【讨论】:

      【解决方案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))]
      

      【讨论】:

        【解决方案4】:

        您可以尝试使用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]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-30
          • 1970-01-01
          • 2021-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多