【发布时间】:2021-04-17 00:04:23
【问题描述】:
我使用 table() 与factor.two 交叉表factor.one(水平A、B、C 和D)(水平0 和1)。如果factor.two 中1 的级别少于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)
})
如果您运行上面的代码,您将看到一个包含两个表的列表。例如,在第一个表中,应删除级别 B 和 D。在第二个表中,应删除级别 A 和 B。
我无法弄清楚最后两行.. 最后一行似乎没有降低任何低于 5 个观察值的水平。我不确定如何对sub.df 进行子集化以降低sub.names.to.drop 中的级别。任何见解将不胜感激。谢谢!
【问题讨论】:
标签: r