Как заполнить NA в R для квази-же строки? - PullRequest
0 голосов
/ 02 января 2019

Я ищу способ заполненияNA в duplicated() строках. Есть абсолютно одинаковые строки, и в одно время есть NA, поэтому я решил заполнить эту строку значением полной строки, но я не вижу, как с этим справиться.

Используя функцию duplicated(), я мог бы получить такой кадр данных:

 df <- data.frame(
   Year = rnorm(5), 
   hour = rnorm(5), 
   LOT = rnorm(5), 
   S123_AA = c('ABF4576','ABF4576','ABF4576','ABF4576','ABF4576'), 
   S135_AA = c('ABF5403',NA,'ABF5403','ABF5403','ABF5403'), 
   S13_BB = c('BF50343','BF50343','BF50343','BF50343',NA),  
   S1763_BB = c('AA3489','AA3489','AA3489','AA3489','AA3489'), 
   S173_BB = c('BQA0478','BQA0478','BQA0478','BQA0478','BQA0478'),
   S234543 = c('AD4352','AD4352','AD4352','AD4352','AD4352'),
   S1265UU5 = c('AZERTY', 'AZERTY', 'AZERTY', 'AZERTY','AZERTY')
 )

Строки похожи, так как же я могу почувствовать NA по значению предыдущего необработанного (которое не является NA)? Нет complete.cases() строк.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Вы можете сделать следующее:

library(zoo)

# get cols with missing values
na_cols <- names(df)[colSums(is.na(df)) > 0]

# fill the missing value backwards
for (i in na_cols){
    df[[i]] <- na.locf(df[[i]])
}
0 голосов
/ 03 января 2019

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

Другими словами, вам необходимо заполнить NA каким-либо значением, чтобы иметь возможность «сохранять» записи в кадре данных. Самый простой способ - выбрать значение определенного столбца путем поиска среднего значения (при работе с основными значениями) или режима (при работе с категориальными значениями) [вы также можете выполнить регрессию, но я предполагаю, что это более сложный метод] .

В этом случае мы можем выбрать режим замены, поскольку атрибуты являются категориальными. Запустив ваш код, мы получим фрейм данных df:

         Year       hour         LOT S123_AA S135_AA  S13_BB S1763_BB S173_BB S234543 S1265UU5
1 -0.32837526  0.7930541 -1.10954824 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
2  0.55379245 -0.7320060 -0.95088434 ABF4576    <NA> BF50343   AA3489 BQA0478  AD4352   AZERTY
3  0.36442118  0.9920967 -0.07345038 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
4 -0.02546781 -0.1127828 -1.78241434 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
5  1.92550340 -1.0531371  0.88318695 ABF4576 ABF5403    <NA>   AA3489 BQA0478  AD4352   AZERTY

Затем мы можем создать функцию для расчета режима определенного столбца:

getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}

А затем используйте его, чтобы заполнить пропущенные значения. Ниже кода для расчета отсутствующих значений для столбца S135_AA (я создал новый кадр данных с именем workdf):

workdf <- df
workdf[is.na(workdf$S135_AA),c('S135_AA')] <- getmode(workdf[,'S135_AA'])

Это вывод, где вы можете видеть, что столбец S135_AA NA принял самое повторяющееся значение столбца:

         Year       hour         LOT S123_AA S135_AA  S13_BB S1763_BB S173_BB S234543 S1265UU5
1 -0.32837526  0.7930541 -1.10954824 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
2  0.55379245 -0.7320060 -0.95088434 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
3  0.36442118  0.9920967 -0.07345038 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
4 -0.02546781 -0.1127828 -1.78241434 ABF4576 ABF5403 BF50343   AA3489 BQA0478  AD4352   AZERTY
5  1.92550340 -1.0531371  0.88318695 ABF4576 ABF5403    <NA>   AA3489 BQA0478  AD4352   AZERTY

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

0 голосов
/ 02 января 2019

Вы можете циклически просмотреть данные и найти первое значение без NA и заменить значения NA на это значение

# Loop through the data
for(c in 1:ncol(df)) {
    vals <- df[,c]
    noneNA <- vals[!is.na(vals)][1]
    vals[is.na(vals)] <- noneNA
    df[,c] <- vals
}

Или же вы можете просмотреть свой элемент данных по элементам и получить значение none NA излибо выше, либо ниже соответствующей ячейки с использованием вложенных циклов.

for(c in 1:ncol(df)) {
    for(r in 1:nrow(df)) {
        if (is.na(df[r,c])) {
            nearVals <- df[c(r-1, r+1),c]
            noneNA <- nearVals[!is.na(nearVals)][1]
            df[r,c] <- noneNA
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...