Удаление столбцов NA в xts

У меня есть xts в следующем формате

                   a        b     c        d       e        f   ......
2011-01-03         11.40    NA    23.12    0.23    123.11   NA  ......
2011-01-04         11.49    NA    23.15    1.11    111.11   NA  ......
2011-01-05         NA       NA    23.11    1.23    142.32   NA  ......
2011-01-06         11.64    NA    39.01    NA      124.21   NA  ......
2011-01-07         13.84    NA    12.12    1.53    152.12   NA  ......

Есть ли функция, которую я могу применить для создания нового xts или data.frame, в котором отсутствуют столбцы, содержащие только NA?

Положение столбцов с NA не статично, поэтому просто удалить эти столбцы по имени или положению невозможно.


person lab_notes    schedule 27.10.2012    source источник


Ответы (4)


Предположим, что DF - это ваш data.frame

 DF [, -which(sapply(DF, function(x) sum(is.na(x)))==nrow(DF))]
               a     c    d      e
2011-01-03 11.40 23.12 0.23 123.11
2011-01-04 11.49 23.15 1.11 111.11
2011-01-05    NA 23.11 1.23 142.32
2011-01-06 11.64 39.01   NA 124.21
2011-01-07 13.84 12.12 1.53 152.12
person Jilber Urbina    schedule 27.10.2012
comment
Более надежным решением было бы: DF[, sapply(DF, function(x) sum(is.na(x)))!=nrow(DF)], потому что оно будет работать, даже если нет столбцов со всеми пропущенными значениями (см. мой ответ). - person Joshua Ulrich; 27.10.2012

@Jiber решение работает, но может дать неожиданные результаты, если нет столбцов со всеми NA. Например:

# sample data
library(xts)
data(sample_matrix)
x <- as.xts(sample_matrix)

# Jiber's solution, when no columns have all missing values
DF <- as.data.frame(x)
DF[, -which(sapply(DF, function(x) sum(is.na(x)))==nrow(DF))]
# data frame with 0 columns and 180 rows

Вот решение, которое работает независимо от того, есть ли столбцы со всеми пропущенными значениями:

y <- x[,apply(!is.na(x), 2, all)]
x$High <- NA
x$Close <- NA
z <- x[,apply(!is.na(x), 2, all)]
person Joshua Ulrich    schedule 27.10.2012

Попробуй это:

dataframe[,-which(apply(is.na(dataframe), 2, all))]
person Fridiculous    schedule 27.10.2012
comment
А если я не знаю, какие столбцы содержат NA? - person lab_notes; 27.10.2012
comment
это принимает во внимание любой заданный кадр данных, не зная заранее NA. - person Fridiculous; 27.10.2012

Это кажется проще:

DF[, colSums(is.na(DF)) < nrow(DF)]
person Ali    schedule 27.10.2012
comment
Должно работать либо DF[, !colSums(!is.na(DF)) < nrow(DF)], либо DF[, !colSums(is.na(DF)) > 0]... - person sdittmar; 13.10.2018