按因子基数子集数据框?

Subset data frame by factor cardinality?

我怀疑这将是重复的,但我寻找答案的努力失败了。假设我有一个数据框,其中的列完全由整数或因子组成。其中一些列具有多个水平的因子,而另一些则没有。假设我想 select 部分数据或以其他方式对数据进行子集化,这样我只能得到具有少于 10 个水平的因子的列。我怎样才能做到这一点?我的第一个想法是制作一个特别讨厌的 sapply 命令,但我希望有更好的方法。

我们可以使用select_if

library(dplyr) 
df1 %>%
    select_if(~ is.factor(.) && nlevels(.) < 10)

使用 iris

的可重现示例
data(iris)
iris %>%
       select_if(~ is.factor(.) && nlevels(.) < 10)

或使用sapply

i1 <- sapply(df1, function(x) is.factor(x) && nlevels(x) < 10)
df1[i1]

使用 data.table 你可以:

library(data.table)
setDT(df)
df[,.SD, .SDcols = sapply(df, function(x) length(levels(x))<10)]

示例:

df <- data.table(x = factor(1:3, levels = 1:5), y = factor(1:3, levels = 1:10))
df[,.SD, .SDcols = sapply(df, function(x) length(levels(x))>5)]
 y
1: 1
2: 2
3: 3