删除数据框中包含特定值的因子列
Remove factor columns in data frame which contain specific value
我有一个包含分类变量的数据框 - 具有 2 个水平或 1 个水平的因素。我正在尝试删除所有只有级别的列。由于我有300多个分类变量,我想使用循环或函数。
为了简单起见,这里有一个只有 5 列的示例代码:
B1 <- as.factor(c(1,1,1,1,1,1))
B2 <- as.factor(c(1,0,1,1,0,0))
B3 <- as.factor(c(0,1,1,0,1,0))
B4 <- as.factor(c(0,0,0,0,0,0))
B5 <- as.factor(c(1,0,1,0,1,0))
df <- data.frame(B1,B2,B3,B4,B5)
在这种情况下,我想删除 B1 和 B4 列,因为它们只有一个级别并且具有这样的数据框
B2 B3 B5
1 1 0 1
2 0 1 0
3 1 1 1
4 1 0 0
5 0 1 1
6 0 0 0
我尝试使用多个代码,但没有得到想要的结果。
df1 <- data.frame(df1[,xqual[,c(1:5)] == "1" & df[ ,c(1:5)] == "0"])
或
for (i in 2:dim(df)[2]){
df1[,i] = which(df[,i] == "1" & df[,i] == "0")
}
我们可以使用 select
到 select 具有多个唯一值的列
library(dplyr)
df %>%
select(where(~ n_distinct(.) > 1))
-输出
B2 B3 B5
1 1 0 1
2 0 1 0
3 1 1 1
4 1 0 0
5 0 1 1
6 0 0 0
或者我们可以通过 all
换行来查找特定值
df %>%
select(where(~ all(c(0, 1) %in% .)))
或 Filter
在 base R
Filter(\(x) length(unique(x)) > 1, df)
-输出
B2 B3 B5
1 1 0 1
2 0 1 0
3 1 1 1
4 1 0 0
5 0 1 1
6 0 0 0
或 var
Filter(var, type.convert(df, as.is = TRUE))
另一个基础 R 选项:
df[sapply(df, nlevels) > 1]
B2 B3 B5
1 1 0 1
2 0 1 0
3 1 1 1
4 1 0 0
5 0 1 1
6 0 0 0
或使用Filter
:
Filter(\(x) nlevels(x) - 1, df)
另一个基础 R 选项
> Filter(function(v) var(as.integer(v)),df)
B2 B3 B5
1 1 0 1
2 0 1 0
3 1 1 1
4 1 0 0
5 0 1 1
6 0 0 0
我有一个包含分类变量的数据框 - 具有 2 个水平或 1 个水平的因素。我正在尝试删除所有只有级别的列。由于我有300多个分类变量,我想使用循环或函数。
为了简单起见,这里有一个只有 5 列的示例代码:
B1 <- as.factor(c(1,1,1,1,1,1))
B2 <- as.factor(c(1,0,1,1,0,0))
B3 <- as.factor(c(0,1,1,0,1,0))
B4 <- as.factor(c(0,0,0,0,0,0))
B5 <- as.factor(c(1,0,1,0,1,0))
df <- data.frame(B1,B2,B3,B4,B5)
在这种情况下,我想删除 B1 和 B4 列,因为它们只有一个级别并且具有这样的数据框
B2 B3 B5
1 1 0 1
2 0 1 0
3 1 1 1
4 1 0 0
5 0 1 1
6 0 0 0
我尝试使用多个代码,但没有得到想要的结果。
df1 <- data.frame(df1[,xqual[,c(1:5)] == "1" & df[ ,c(1:5)] == "0"])
或
for (i in 2:dim(df)[2]){
df1[,i] = which(df[,i] == "1" & df[,i] == "0")
}
我们可以使用 select
到 select 具有多个唯一值的列
library(dplyr)
df %>%
select(where(~ n_distinct(.) > 1))
-输出
B2 B3 B5
1 1 0 1
2 0 1 0
3 1 1 1
4 1 0 0
5 0 1 1
6 0 0 0
或者我们可以通过 all
df %>%
select(where(~ all(c(0, 1) %in% .)))
或 Filter
在 base R
Filter(\(x) length(unique(x)) > 1, df)
-输出
B2 B3 B5
1 1 0 1
2 0 1 0
3 1 1 1
4 1 0 0
5 0 1 1
6 0 0 0
或 var
Filter(var, type.convert(df, as.is = TRUE))
另一个基础 R 选项:
df[sapply(df, nlevels) > 1]
B2 B3 B5
1 1 0 1
2 0 1 0
3 1 1 1
4 1 0 0
5 0 1 1
6 0 0 0
或使用Filter
:
Filter(\(x) nlevels(x) - 1, df)
另一个基础 R 选项
> Filter(function(v) var(as.integer(v)),df)
B2 B3 B5
1 1 0 1
2 0 1 0
3 1 1 1
4 1 0 0
5 0 1 1
6 0 0 0