2016-01-24 3 views
2

У меня есть два объекта: матрица и dataframe. Матрица имеет номера во всех ячейках. Второй кадр данных имеет NA в нескольких ячейках. Как я могу убедиться, что первая матрица имеет NA в том же точном положении, что и в последнем кадре данных.Репликация местоположений ячеек NA в одном кадре данных в другом

Я попробовал complete.case() и na.omit, но это, к сожалению, удаляет ряд вместе. Я попробовал цикл for, где он итерации по столбцу, затем по строке, проверяет, где ячейка равна нулю, и возвращает местоположение, которое затем будет загружаться в dataframe indp. Получите несколько ошибок вокруг размеров:

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

numZero <- 0 
cols <- 0  
for (i in 1:ncol(ws)){ 
    for (k in 1:nrow(ws)){ 
    if (is.na(ws[k,i])){ 
     print(indp[i,k]) 
     indp[i,k] <- 0 
     numZero <- numZero + 1 
    } 

    } 
    cols <- cols +1 
} 

Следует отметить, что indp является матрицей.

Добавлено cols и numzero, чтобы сохранить вкладку на количество строк и столбцов, потому что я продолжаю получать следующую ошибку: Ошибка в indp [i, k]: индекс за пределами. Indp и ws имеют одинаковые размеры. Однако счетчики col и numzero возвращают cols и строки, которые отличаются от размеров. Также с матрицей indp ничего не происходит. Я что-то упускаю?

также прилагаю фотографии двух, чтобы помочь осмыслять: indp

Обратите внимание на 0-х: ws

Глядя сделать следующее: Оригинальная матрица:

[,1] [,2] [,3] [,4] [,5] 
[1,] 1 6 11 16 21 
[2,] 2 7 12 17 22 
[3,] 3 8 13 18 23 
[4,] 4 9 14 19 24 
[5,] 5 10 15 20 25 

кадр данных:

V1 V2 V3 V4 V5 
1 1 5 1 0 NA 
2 3 3 1 2 2 
3 0 1 5 4 NA 
4 5 NA 3 2 0 
5 NA 0 3 4 1 

Я хотел бы, первая матрица будет поступать в соответствии с выше - имеют Nas точно в тех же клетках:

[,1] [,2] [,3] [,4] [,5] 
[1,] 1 6 11 16 NA 
[2,] 2 7 12 17 22 
[3,] 3 8 13 18 NA 
[4,] 4 NA 14 19 24 
[5,] NA 10 15 20 25 

В дополнение к этому,

m1 <- matrix(1:25, 5, 5);set.seed(25); 
dat1 <- as.data.frame(matrix(sample(c(NA,0:5), 5*5, replace=TRUE), ncol=5)) 
numZero <- 0 
cols <- 0  
for (i in 1:ncol(dat1)){ 
    for (k in 1:nrow(dat1)){ 
    if (is.na(dat1[k,i])){ 
     print(dat1[i,k]) 
     m1[i,k] <- 0 
     numZero <- numZero + 1 
    } 
    else{ 
     print(dat1[i,k]) 
    } 

    } 
    cols <- cols +1 
} 

Печать записи ячеек на каждой итерации для сравнения с исходными объектами данных, но я получаю разные цифры к тому, что в них странно, как я думал, m1 [1,1], например должен вернуть запись ячейки.

+0

Вы можете сделать 'm1 [is.na (dat1)] <- NA' – akrun

+0

Не уверен, что я следую akrun? Как это относится к обеим объектам? –

+0

Как я понимаю вопрос 'm1 <- matrix (1:25, 5, 5); set.seed (25); dat1 <- as.data.frame (matrix (sample (c (NA, 0: 5), 5 * 5, replace = TRUE), ncol = 5)) 'Код выше заменяет значения в' m1' на NA для соответствующих значений 'NA' в 'dat1' – akrun

ответ

0

Мы можем получить логическую матрицу с is.na(dat1), извлеките элементы в «m1», что соответствует истинным значениям из логической матрицы и присвоить его NA

m1[is.na(dat1)] <- NA 
m1 
#  [,1] [,2] [,3] [,4] [,5] 
#[1,] 1 6 11 16 NA 
#[2,] 2 7 12 17 22 
#[3,] 3 8 13 18 NA 
#[4,] 4 NA 14 19 24 
#[5,] NA 10 15 20 25