【发布时间】:2020-05-03 19:53:55
【问题描述】:
我怀疑这将是重复的,但我寻找答案的努力失败了。假设我有一个数据框,其中的列完全由整数或因子组成。其中一些列具有许多级别的因子,而有些则没有。假设我想选择部分数据或以其他方式对数据进行子集化,以便我只获得具有少于 10 个级别的因子的列。我怎样才能做到这一点?我的第一个想法是做一个特别讨厌的sapply 命令,但我希望有更好的方法。
【问题讨论】:
我怀疑这将是重复的,但我寻找答案的努力失败了。假设我有一个数据框,其中的列完全由整数或因子组成。其中一些列具有许多级别的因子,而有些则没有。假设我想选择部分数据或以其他方式对数据进行子集化,以便我只获得具有少于 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
【讨论】: