2016-11-21 2 views
0

У меня есть список фреймов данных ls.df.val.dcas. Каждый блок данных имеет различные столбцы с некоторыми отсутствующими значениями, которые являются NA. Я хотел бы использовать lappy() для списка, чтобы удалить те столбцы, которые больше чем X% (например, 40%) их значений являются NA. Чтобы дать вам представление о том, как dataframes в списке выглядят как я показываю пример:Как использовать lapply для удаления столбцов со слишком большим количеством отсутствующих значений в списке в R?

$ SK_VALUES_IMV_EU28_INTRA :'data.frame': 74 obs. of 65 variables: 
    ..$ PERIOD : Date[1:74], format: "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" ... 
    ..$ 2207 : num [1:74] 1078759 1850083 1872924 1038070 626471 ... 
    ..$ 2208 : num [1:74] 3329179 7061890 1351550 1371469 1557605 ... 
    ..$ 220710 : num [1:74] 1030704 1804495 1831958 972263 574855 ... 
    ..$ 220720 : num [1:74] 48055 45588 40966 65807 51616 ... 
    ..$ 220820 : num [1:74] 380843 1014933 71804 126348 138138 ... 
    ..$ 220830 : num [1:74] 380007 459653 155033 205879 297446 ... 
    ..$ 220840 : num [1:74] 41561 88449 31549 60768 117534 ... 
    ..$ 220850 : num [1:74] 94483 340439 44949 32949 37550 ... 
    ..$ 220860 : num [1:74] 371217 728521 143974 179311 254546 ... 
    ..$ 220870 : num [1:74] 731231 1374532 228087 227772 230129 ... 
    ..$ 22082014: num [1:74] NA 2531 1776 NA NA ... 
$ RO_VALUES_IMV_EU28_EXTRA :'data.frame': 74 obs. of 44 variables: 
    ..$ PERIOD : Date[1:74], format: "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" ... 
    ..$ 2207 : num [1:74] NA NA NA NA NA 5 NA NA NA NA ... 
    ..$ 2208 : num [1:74] 312035 840540 315008 884357 100836 ... 
    ..$ 220710 : num [1:74] NA NA NA NA NA 5 NA NA NA NA ... 
    ..$ 220720 : num [1:74] NA NA NA NA NA NA NA NA NA NA ... 
    ..$ 220820 : num [1:74] 3570 698 483 1087 1802 ... 

Мое неполное решение основано на подсчете количества НС в каждом столбце каждого dataframe и вычисления процента NA , Затем удалите эти столбцы, чтобы процент был больше X%.

# Counting the number of NA 
ls.Nan <- lapply(ls.df.val.dcas, function(x) colSums(!is.na(x))) 
# Calculating the lengths of all column 
ls.size <- lapply(ls.df.val.dcas, function(x) dim(x)) 

# we want the first element of size which shows the number of rows. 
ls.percen <- mapply(function(x,y) x/y[1] , x=ls.Nan, y=ls.size) 
# keeping those columns that have more than half of the data on that category 

mis.list <- sapply(ls.df.val.dcas, "]]" sapply(ls.percen, function(x) x >= NPI)) 

Я получаю следующую ошибку при запуске последней строки.

Error: unexpected symbol in "mis.list <- sapply(ls.df.val.dcas, "]]" sapply" 

В конечном счете, я также хотел бы объединить все эти функции в одну функцию, а затем использовать один раз. Но сейчас я изо всех сил пытаюсь понять систему индексирования lapply, применяемую к списку данных. Если кто-нибудь может продемонстрировать пример, как использовать lapply с разной гранулярностью списков, тогда это было бы здорово. Например, как следует писать функции, когда вы хотите изменить элемент списка или фрейм данных в списке или столбец в кадре данных списка.

EDIT Приведенный ниже комментарий о забывании поместить запятую после "]]". Я исправил код, но все еще получаю ошибку

> mis.list <- sapply(ls.df.val.dcas, "]]", sapply(ls.percen, function(x) x >= NPI)) 
Error in get(as.character(FUN), mode = "function", envir = envir) : 
    object ']]' of mode 'function' was not found 

Кстати, ИЯФ просто процент порога в ВПЛ колонке. Например, я установил его в NPI = 0,35

Поскольку я подозреваю, что ошибка связана со структурой моих данных, я добавил дополнительную информацию о структуре ls.percen.

> str(ls.percen) 
    List of 69 
    $ AT_VALUES_IMV_EU28_EXTRA : Named num [1:59] 1 0.635 1 0.378 0.338 ... 
     ..- attr(*, "names")= chr [1:59] "PERIOD" "2207" "2208" "220710" ... 
    $ AT_VALUES_IMV_EU28_INTRA : Named num [1:67] 1 0.986 0.986 0.986 0.986 ... 
     ..- attr(*, "names")= chr [1:67] "PERIOD" "2207" "2208" "220710" ... 
    $ BE_VALUES_IMV_EU28_EXTRA : Named num [1:57] 1 1 1 1 0.365 ... 
     ..- attr(*, "names")= chr [1:57] "PERIOD" "2207" "2208" "220710" ... 
    $ BE_VALUES_IMV_EU28_INTRA : Named num [1:69] 1 0.986 0.986 0.986 0.986 ... 
     ..- attr(*, "names")= chr [1:69] "PERIOD" "2207" "2208" "220710" ... 

ответ

0

Может быть просто опечатка (а не проблема с индексацией): это сообщение говорит вам не хватает запятой, и это должно быть возможно:

mis.list <- sapply(ls.df.val.dcas, "]]", sapply(ls.percen, function(x) x >= NPI)) 

Мы не видим, определение от «NPI». Может быть проще объединить первые два «lapply» вызовы (и возвращает нужный список закороченных DF-х) с:

mis.lst <- lapply(ls.df.val.dcas, 
        function(x) x[ , colSums(!is.na(x))/nrow(x) > .40 ]) 

Вы можете использовать логическое индексирование в положении «J» для версии два аргумента «[ ».

+0

Благодарим вас за ответ. Первая строка кода по-прежнему не работает, хотя я исправил эту опечатку и добавил запятую. Вторая предложенная строка кода работает отлично. – Micromann

+0

Могу я задать вам еще один вопрос? Как я могу теперь заменить NA во всех фреймах и столбцах моего списка на ноль, используя одну из применяемых семейных функций? Следующая строка кода не работает: basic.lst <- lapply (mis.lst, function (x) x [is.na (x)] <- 0) – Micromann

+0

Это дубликат вопроса, который был задан несколько раз на SO. Вы должны искать _before_ задавая вопросы. –

Смежные вопросы