如果列中的值相似,则删除数据库中的列

时间:2016-06-20 13:45:18

标签: r binary

我正在为R学校做一个项目,我有一个包含许多二进制值的数据库。 我想删除特定列。

例如,如果列" A"仅包含值1和NA。列B只有值0和NA。我想删除这些列。但是如果列包含像C和D这样的两个(0和1),我想保留它们包括NA值:

    My_data_frame):                   My_future_data_frame):
                    A  B  C  D                                   C  D
                 x  1  0  1  1                                x  1  1
                 y  1  0  0  1                                y  0  1
                 z  1  0  1  0                                z  1  0
                 t  NA NA NA NA                               t  NA NA

2 个答案:

答案 0 :(得分:1)

以下是我使用colSums的解决方案。

#Sample Data
X1 <- matrix(sample(c(0,1), 30, replace = TRUE, ), ncol = 3)
X2 <- rep(0, 10)
X3 <- rep(1, 10)

data  <- cbind(X1,X2,X3)

> data
            X2 X3
 [1,] 0 1 1  0  1
 [2,] 0 1 0  0  1
 [3,] 1 1 1  0  1
 [4,] 0 0 0  0  1
 [5,] 0 0 1  0  1
 [6,] 1 1 0  0  1
 [7,] 1 1 1  0  1
 [8,] 0 0 1  0  1
 [9,] 0 0 1  0  1
[10,] 1 0 1  0  1

由于我们有二进制数据,我们知道如果和等于0或等于行数我们有零方差。我们可以确定这个为真的列,然后从数据中删除它们。

zero_var_id <- which(colSums(data) == 0 | colSums(data) == nrow(data))
data        <- data[ ,-zero_var_id] 

编辑:要处理更新示例中的NAs,请使用以下命令:

zero_var_id <- which(colSums(na.omit(data)) == 0 | colSums(na.omit(data)) == nrow(na.omit(data)))
data        <- data[ ,-zero_var_id] 

答案 1 :(得分:1)

这是一种可以摆脱常数列的方法:

##### Removing constant columns
cat("\n## Removing the constants columns.\n")
for (f in names(My_data_frame)) {
  if (length(unique(My_data_frame[[f]])) == 1) {
    cat(f, "is constant in my data frame. We delete it.\n")
    My_data_frame[[f]] <- NULL
  }
}

考虑到我看到的新NA规则,这是同样的解决方案:)

##### Removing constant columns (considering NA's)
cat("\n## Removing the constants columns .\n")
for (f in names(My_data_frame)) {
  if length(unique(iris[[f]][!is.na(iris[[f]])])) == 1) {
    cat(f, "is constant in my data frame. We delete it.\n")
    My_data_frame[[f]] <- NULL
  }
}