Вот простая функция, которая может быть применена ко всем столбцам в кадре данных, возвращая только те, которые являются числовыми и не все равны нулю:
# Fake data
dat = data.frame(x=rnorm(5),
y=rep(0,5),
z=sample(c(1,0),5,replace=TRUE),
w=sample(LETTERS[1:3],5,replace=TRUE),
stringsAsFactors=FALSE)
dat
x y z w
1 0.5450570 0 0 B
2 0.5292899 0 0 B
3 -0.2142306 0 1 C
4 -0.7246841 0 0 C
5 -0.7567683 0 1 A
# Remove columns with all zeros or that are not numeric
dat[, !sapply(names(dat), function(col) {all(dat[,col]==0) |
!is.numeric(dat[,col])})]
x z
1 0.5450570 0
2 0.5292899 0
3 -0.2142306 1
4 -0.7246841 0
5 -0.7567683 1
Для распаковки этого, функция проверяет, для одного столбца dat
, имеет ли он все нули или не является числовым. sapply
затем «применяет» эту функцию к каждому столбцу в кадре данных, возвращая логический вектор с TRUE
для столбцов dat
со всеми нулями или не численными и FALSE
для столбцов, которые являются числовыми, а не всеми нулями. !
(«НЕ») перед sapply
просто меняет значения FALSE
и TRUE
:
!sapply(names(dat), function(col) {
all(dat[, col]==0) | !is.numeric(dat[, col])
})
x y z w
TRUE FALSE TRUE FALSE
Затем мы используем этот логический вектор возвращать только те столбцы, которые dat
TRUE
.
dat[ , c(TRUE, FALSE, TRUE, FALSE)]
x z
1 0.5450570 0
2 0.5292899 0
3 -0.2142306 1
4 -0.7246841 0
5 -0.7567683 1
Наконец, чтобы проверить, не числовые столбцы, которые были удалены, выполните следующие действия, которые будет возвращать все нецифровых столбцы:
dat[, sapply(names(dat), function(col) {!is.numeric(dat[,col])})]
'unique (Col) == 0'? – Hugh