Пожалуйста, посмотрите мое обновление в конце на основе нового примера, который вы добавили.
#I have a data set in the form of a tibble
data_set <- as.data.frame(matrix(nrow=8))
data_set$column1_set1 <- c(1,1,1,1,1,1,1,1)
data_set$column2_set1 <- c(1,1,1,1,0,1,1,1)
data_set$column3_set1 <- c(1,1,1,1,1,1,1,1)
data_set$column1_set2 <- c(1,1,1,1,1,1,1,1)
data_set$column2_set2 <- c(1,1,1,1,1,1,1,1)
data_set$column3_set2 <- c(1,1,1,1,1,1,1,1)
data_set$V1 <- NULL
data_set <- as.tibble(data_set)
# In each row I have to check columns in sets of 3.
# i.e if one of the columns value=0 I have to delete all three columns
# and evaluate the next 3 columns.
Вы можете сделать это так:
cn <- colnames(data_set)
for(i in seq(1,length(cn),3)){
if(any(colSums(data_set[,i:(i+2)]) < nrow(data_set))){
data_set <- data_set[,!colnames(data_set) %in% cn[i:(i+2)]]
} else{
next
}
}
В новом примере у нас есть несколько нечисловых столбцов. Единственное изменение, которое мы должны сделать, это сначала проверить, являются ли они числовыми.
cn <- colnames(data_set)
for(i in seq(1,length(cn),3)){
cn_tmp <- cn[i:(i+2)]
cn_tmp <- ifelse(class(data_set[,colnames(data_set) %in% cn_tmp])=="numeric",
cn_tmp, cn_tmp[!cn_tmp==cn_tmp[i]])
cn_tmp <- ifelse(class(data_set[,colnames(data_set) %in% cn_tmp])=="numeric",
cn_tmp, cn_tmp[!cn_tmp==cn_tmp[i+1]])
cn_tmp <- ifelse(class(data_set[,colnames(data_set) %in% cn_tmp])=="numeric",
cn_tmp, cn_tmp[!cn_tmp==cn_tmp[i+2]])
if(any(colSums(data_set[,colnames(data_set) %in% cn_tmp]) < nrow(data_set))){
data_set <- data_set[,!colnames(data_set) %in% cn[i:(i+2)]]
} else{
next
}
}