Удалить столбцы NA в sparklyr

У меня есть кадр данных с 75 столбцами, из которых 12 столбцов имеют все NA, а некоторые - 70% NA. Я хочу удалить столбцы, имеющие> = 70% NA.

Может ли кто-нибудь помочь мне в этом? Я попытался

df[,! apply( df , 2 , function(x) all(is.na(x)) )

но я получаю исключение как:

Ошибка: невозможно получить spark_connection из объекта класса NULL.

Я также пробовал:

df[colSums(!is.na(df)) != nrow(df)]

и

df[, colSums(is.na(df)) < nrow(df)]

Но я получаю исключение, поскольку

Ошибка в colSums(!is.na(df)) : 'x' должен быть массивом не менее двух измерений


person Mansoor    schedule 23.03.2017    source источник


Ответы (1)


Это кажется немного сложным в sparklyr, но мы можем получить индекс столбцов, которые необходимо удалить из локальной копии набора данных, и использовать select для удаления этих столбцов.

j1 <- which(!colSums(!is.na(df)))
library(sparklyr)
sc <- spark_connect(master = "local")
df_tbl <- copy_to(sc, df)
library(dplyr)
df_tbl %>% 
         select(-j1)
# Source:   query [20 x 2]
#Database: spark connection master=local[4] app=sparklyr #local=TRUE

#    col2        col3
#   <int>       <dbl>
#1      1 -1.31690812
#2      1  0.59826911
#3      4 -0.76221437
#4      3 -1.42909030
#5      3  0.33224445
#6      5 -0.46906069
#7      1 -0.33498679
#8      4  1.53625216
#9      4  0.60999453
#10     1  0.51633570
#11     3 -0.07430856
#12     2 -0.60515695
#13     4 -1.70964518
#14     4 -0.26869311
#15     1 -0.64859151
#16     5 -0.09411013
#17     1 -0.08554095
#18    NA  0.11953107
#19     3 -0.11629639
#20    NA -0.94382724

данные

set.seed(24)
df <- data.frame(col1 = NA_real_, col2 = sample(c(NA, 1:5), 20, 
               replace = TRUE), col3 = rnorm(20))
person akrun    schedule 23.03.2017
comment
Проблема с этим решением заключается в том, что я не знаю, какие столбцы являются NA. Это не может быть статический список. В любом случае спасибо. - person Mansoor; 23.03.2017
comment
@ Мансур Тебе не обязательно знать. Программно находится из первой строки кода j1 <- which(!colSums(!is.na(df))) - person akrun; 23.03.2017
comment
Акрун, как я уже упоминал, не обязательно, чтобы все столбцы были АН. 70% нет данных - person Mansoor; 24.03.2017
comment
@Mansoor Мой код был основан на коде, который вы показали в своем посте. Если это не так, то мы можем легко разобраться с этим - person akrun; 24.03.2017
comment
@Mansoor, если это 70%, измените «j1» на ji <- which(colSums(is.na(df))/nrow(df) >= 0.7) - person akrun; 24.03.2017
comment
Основная цель использования spark - обработка больших наборов данных, работа с локальной копией данных и многое другое, использование copy_to (sc, df), которое не поддерживает большие наборы данных, ваше решение кажется мне бесполезным. - person user1767316; 03.05.2019
comment
@user1767316 user1767316 Хорошо, тогда попробуйте опубликовать новый вопрос. В любом случае, этот пост немного устарел, - person akrun; 03.05.2019