Вопрос по r, dataframe – Удаление столбцов из data.frame, где NA составляет более 15% длины столбца

3

у меня естьdata.frame из 10 различных столбцов (длина каждого столбца одинакова). Я хочу удалить любой столбец, который имеет & apos;NA& APOS; больше 15% длины столбца.

Нужно ли сначала сделать функцию для расчета процентаNA для каждого столбца, а затем сделать еще одинdata.frame где я применяю функцию? Какой лучший способ сделать это?

Ваш Ответ

2   ответа
0

Загрузите данные в data.table. Назовите это DT. Скажите, что столбцы со 2 по 4 являются числовыми

Theta = 0.15
Drop <- DT[, lapply(.SD, function (x) {sum(is.na(x))/length(x) > Theta} ), .SDcols = 2:4]
Cols.2.Drop <- names(Drop)[which(Drop==TRUE)]
DT[, (Cols.2.Drop) := NULL]

Протестировано с данными здесь:

Obs Var1    Var2    Var3
A0001   21  21  21
A0002   21  78  321
A0003   32  98  87
A0004   21  12  54
A0005   21  13  45
A0006   21  87  45
B0007   84  NA  45
B0008   21  NA  98
B0009   2   NA  45
B0010   12  NA  45
8

всегда полезно поделиться некоторыми примерами данных. Это не должно быть вашими фактическими данными - что-то составлено хорошо.

set.seed(1)
x <- rnorm(1000)
x[sample(1000, 150)] <- NA
mydf <- data.frame(matrix(x, ncol = 10))

Во-вторых, вы можете просто использовать встроенные функции, чтобы получить то, что вам нужно. Вот,is.na(mydf) делает логическую проверку и возвращаетdata.frame изTRUE а такжеFALSE, посколькуTRUE а такжеFALSE приравнивать к1 а также0мы можем просто использоватьcolMeans чтобы получить среднее числоTRUE (являетсяNA) ценности. Это, в свою очередь, может быть проверено в соответствии с вашими условиями, в этом случае столбцы имеют более 15%NA ценности?

colMeans(is.na(mydf)) > .15
#    X1    X2    X3    X4    X5    X6    X7    X8    X9   X10 
#  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE FALSE

Как мы видим, мы должны отбросить X1, X2, X6, X8 и X9. Опять же, используя преимущества логических векторов, вот как:

> final <- mydf[, colMeans(is.na(mydf)) <= .15]
> dim(final)
[1] 100   5
> names(final)
[1] "X3"  "X4"  "X5"  "X7"  "X10"

Похожие вопросы