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

时间:2015-08-18 11:23:14

标签: r sapply

我有8列变量,我必须保留第1列到第3列。对于第4到第8列,我需要保留那些只有3级且丢弃不符合条件的那些。

我尝试了以下命令

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

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

3 个答案:

答案 0 :(得分:1)

您可以执行两个步骤:

all =TRUE

根据您希望的输出结果,可以尝试使用merge()中的选项m_imageFile = QFileDialog::getOpenFileName(this, tr("Open Image"), QDir::homePath(), tr("Image Files (*.png *.jpg *.bmp)"), 0, QFileDialog::DontUseNativeDialog); //works

答案 1 :(得分:1)

我建议采用另一种方法:

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)

答案 2 :(得分:0)

假设列4:8是factor类,我们也可以使用nlevelsfilter列。我们创造了'toKeep&#39;作为要保留的列的数字索引,以及&#39; toFilter&#39;作为filter列的数字索引。我们将数据集分为两部分:1)使用&#39; toKeep&#39;作为索引(data2[toKeep]),2)使用&#39; toFilter&#39;,我们通过使用sapply循环来进一步对数据集进行子集化以查找级别数(nlevels) ,创建逻辑索引(==3)到filter列,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))