【问题标题】:Drop factor level with few observations几乎没有观察值的下降因子水平
【发布时间】:2021-04-17 00:04:23
【问题描述】:

我使用 table() 与factor.two 交叉表factor.one(水平ABCD)(水平01)。如果factor.two1 的级别少于5 个,我想在factor.one 中删除一个级别

在下面的示例代码中,我循环通过名为location 的第三个因素变量来创建这些表。我正在使用它为生存模型构建一个动态公式,该模型仅包含事件计数超过 5 个的分类变量级别。

一些数据:

factor.one <- factor(c(rep("A", 20), rep("B", 25), rep("C", 30), rep("D", 37))) 
factor.two <- factor(c(rep(1, 10), rep(0, 10), rep(1, 4), rep(0, 21), rep(1, 15), rep(1, 15), rep(1, 15), rep(0, 22)))
location <-c(rep("US", 60), rep("Canada", 52))
df <- data.frame(factor.one, factor.two, location)

到目前为止我已经尝试过:

test <- lapply(unique(df$location), function(x) {
  
  sub.df <- dplyr::filter(df, location == x) 
  
  sub.table <- table(sub.df$factor.one, sub.df$factor.two)
  
  sub.names.to.drop <- rownames(sub.table)[sub.table[, 2] < 5]
   
  sub.dropped <- sub.df[!any(levels(sub.df$factor.one)) %in% sub.names.to.drop]
  
  return(sub.dropped)
  
})

如果您运行上面的代码,您将看到一个包含两个表的列表。例如,在第一个表中,应删除级别 BD。在第二个表中,应删除级别 AB

我无法弄清楚最后两行.. 最后一行似乎没有降低任何低于 5 个观察值的水平。我不确定如何对sub.df 进行子集化以降低sub.names.to.drop 中的级别。任何见解将不胜感激。谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    最后一行不需要any,也不需要逐级下降。请尝试以下操作:

    test <- lapply(unique(df$location), function(x) {
      sub.df <- dplyr::filter(df, location == x) 
      sub.table <- table(sub.df$factor.one, sub.df$factor.two)
      sub.names.to.drop <- rownames(sub.table)[sub.table[, 2] < 5]
      sub.dropped <- sub.df[!sub.df$factor.one %in% sub.names.to.drop, ]
      return(droplevels(sub.dropped))
    })
    

    【讨论】:

      猜你喜欢
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多