如何同时保留和删除具有特定条件的列

How to keep and remove columns with certain condition simultaneously

我有 8 列变量,我必须保留第 1 到第 3 列。对于第 4 到第 8 列,我需要保留那些只有 3 个级别的变量并删除不符合该条件的变量。

我尝试了以下命令

data3 <- data2[,sapply(data2,function(col)length(unique(col)))==3]

它设法保留了 3 个级别的变量,但删除了我的前 3 列。

您可以分两步进行:

data4 <- data2[1:3]
#Your answer for the second part here:
data3 <- data2[,sapply(data2,function(col)length(unique(col)))==3]
merge(data3,data4)

根据您希望的预期输出,可以尝试使用 merge().

中的选项 all =TRUE

我建议另一种方法:

x = 1:3
cbind(data2[x], Filter(function(i) length(unique(i))==3, data2[-x]))

#   1  2  3 5
#1  a  1  3 b
#2  b  2  4 b
#3  c  3  5 b
#4  d  4  6 a
#5  e  5  7 c
#6  f  6  8 c
#7  g  7  9 c
#8  h  8 10 a
#9  i  9 11 c
#10 j 10 12 b

数据:

data2 = setNames(
          data.frame(letters[1:10], 
                     1:10, 
                     3:12, 
                     sample(letters[1:10],10, replace=T),
                     sample(letters[1:3],10, replace=T)),
          1:5)

假设4:8列是factorclass,我们也可以用nlevelsfilter列。我们创建 'toKeep' 作为要保留的列的数字索引,并创建 'toFilter' 作为 filter 的列的数字索引。我们将数据集分为两部分:1) 使用 'toKeep' 作为索引 (data2[toKeep]),2) 使用 'toFilter',我们通过循环 sapply 进一步对数据集进行子集化要查找级别数 (nlevels),请为 filter 列创建逻辑索引 (==3),并为第一个子集创建 cbind

toKeep <- 1:3
toFilter <- setdiff(seq_len(ncol(data2)), n)
cbind(data2[toKeep], data2[toFilter][sapply(data2[toFilter], nlevels)==3])
#  V1 V2 V3 V4 V6
#1  B  B  D  C  B
#2  B  D  D  A  B
#3  D  E  B  A  B
#4  C  B  E  C  A
#5  D  D  A  D  E
#6  E  B  A  A  B

数据

set.seed(24)
 data2 <- as.data.frame(matrix(sample(LETTERS[1:5], 8*6, replace=TRUE), ncol=8))