我正在为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
答案 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
}
}