2015-06-02 7 views
3

Мне было предоставлено большое значение csv, равное 115 столбцам и 1000 строк. Столбцы имеют множество данных, некоторые из них основаны на символах, некоторые - целые и т. Д. Однако данные имеют множество нулевых переменных разных типов (NA, -999, NULL и т. Д.).Использование lapply для отображения процента нулевых переменных в каждом столбце в R

Что я хочу сделать, это написать сценарий, который будет генерировать список столбцов, где более 30% данных в столбце является NULL какого-либо типа.

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

length(which(indata$ObservationYear == "" | is.na(indata$ObservationYear) | 
indata$ObservationYear == "NA" | indata$ObservationYear == "-999" | 
indata$ObservationYear == "0"))/nrow(indata) 

Я хочу написать скрипт, чтобы сделать это для всех столбцов. Я считаю, что мне нужно использовать функцию lapply.

Я попытался сделать это здесь, однако, я не могу показаться, чтобы получить этот сценарий, чтобы работать на всех:

Null_Counter <- lapply(indata, 2, length(x), 
        length(which(indata == "" | is.na(indata) | indata == "NA" | indata == "-999" | indata == "0"))) 
        names(indata(which(0.3>=Null_Counter/nrow(indata)))) 

я получаю следующие ошибки:

Error in match.fun(FUN) : '2' is not a function, character or symbol 

и:

Error: could not find function "indata" 

В идеале, то, что я хочу, чтобы дать мне, является векторным списком всех имен столбцов, где процент всех нулевых переменных (NA, -999, 0 , NULL) составляет более 30%.

Может ли кто-нибудь помочь?

+2

'lapply' не нужен' MARGIN'. Это для «apply». Вы можете проверить примеры в '? Lapply' – akrun

ответ

1

Я считаю, что вы хотите использовать apply, а не lapply, которые применяют функцию к списку. Попробуйте это:

Null_Counter <- apply(indata, 2, function(x) length(which(x == "" | is.na(x) | x == "NA" | x == "-999" | x == "0"))/length(x)) 
Null_Name <- colnames(indata)[Null_Counter >= 0.3] 
+0

Большое спасибо. Моим окончательным решением было следующее: null_counts <- apply (indata, 2, function (x) length (which (x == "" | is.na (x) | x == "NA" | x == " -999 "| x ==" 0 "))) null_flags <- colnames (indata [which (0.5 <= null_counts/nrow (indata))]) –

0

Вот другой способ сделать это в data.table:

#first, make a reproducible example: 
library(data.table) 
#make it so that all columns have ~30% "NA" as you define it 
dt<-as.data.table(replicate(
    115,sample(c(1:100,"",NA,"NA",-999,0),size=1000,replace=T, 
      prob=c(rep(.007,100),rep(.06,5))))) 

Теперь, выяснить, какие хлопотно:

x<-as.matrix(dt[,lapply(.SD,function(x){ 
    mean(is.na(x) | x %in% c("","NA","-999","0"))})]) 
colnames(x)[x>.3] 

Там, наверное, более краткий путь делая это, но это ускользает от меня.

Если вы пытаетесь сбросить эти столбцы, это может быть скорректирована:

dt[,!colnames(x)[x>.3],with=F] 

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

  • Нет связанных вопросов^_^