按因子基数子集数据框?
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
我怀疑这将是重复的,但我寻找答案的努力失败了。假设我有一个数据框,其中的列完全由整数或因子组成。其中一些列具有多个水平的因子,而另一些则没有。假设我想 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