Используйте матрицу для заполнения значений NA в другой матрице

#r #matrix

Вопрос:

Я пытаюсь заменить значения NA из одной матрицы значениями из строки с тем же именем в отдельной матрице.
Это часть цикла для обработки 32 матриц с разными номерами строк, поэтому мне нужен код, который ссылается на расположение NA, предпочтительно по имени строки. Максимальное количество строк-7, все данные состоят из двух столбцов.

 #Sample Matrices:    
> ss.
                SD_d13c  SD_d15n
    Arthropod 2.0550750 1.417745
    C4Plants  3.8064638 2.606882
    Lichen           NA       NA
    MiddleC3  0.8845903 1.244990
    UpperC3   1.2798437 1.795272

 > s.sds
             SD_d13c SD_d15n
Arthropod       2.39    2.10
C4Grass         2.71    1.56
C4Plants        2.04    2.57
Carex NFixer    0.71    1.63
Lichen          0.93    2.29
MiddleC3        1.07    1.79
UpperC3         2.07    2.40

#Leading to this:
> s.sds
             SD_d13c SD_d15n
Arthropod 2.0550750 1.417745
C4Plants  3.8064638 2.606882
Lichen         0.93     2.29
MiddleC3  0.8845903 1.244990
UpperC3   1.2798437 1.795272
 

В образце я хочу заменить значения NA в строке «Лишайник» ss. со значениями «Лишайника» в s.sds и не могу понять, как автоматизировать это в цикле, учитывая количество строк в ss. будет меняться (2-7 строк), в то время как количество номеров строк в s.sds остается 7.

Может быть, мне нужно пройти все итерации и сделать так, чтобы все они имели семь строк, чтобы номера строк совпадали? Вот только я не могу этого сделать, не искажая свои данные. Цель этого кода-заменить значения NA значениями стандартного отклонения сайта. Эти значения зависят от категории растительности. Если категория не была найдена на сайте, она не указана в матрице сайта.

Очевидно, что я могу выполнять каждую итерацию вручную, но я хочу научиться автоматизировать такие вещи, если это возможно.

Комментарии:

1. ключевая функция coalesce или fcoalesce .

Ответ №1:

 ss. <- as.matrix(read.table(text = "
                SD_d13c  SD_d15n
    Arthropod 2.0550750 1.417745
    C4Plants  3.8064638 2.606882
    Lichen           NA       NA
    MiddleC3  0.8845903 1.244990
    UpperC3   1.2798437 1.795272"))

s.sds <- as.matrix(read.table(text = "
             SD_d13c SD_d15n
Arthropod       2.39    2.10
C4Grass         2.71    1.56
C4Plants        2.04    2.57
Carex NFixer    0.71    1.63
Lichen          0.93    2.29
MiddleC3        1.07    1.79
UpperC3         2.07    2.40"))



ss.2 <- ss. # make a new copy of your target matrix
NAs <- which(is.na(rowSums(ss.))) # identify rows with missing values
ss.2[names(NAs),] <- s.sds[names(NAs),] # pass values from s.sds 
ss.2 # result
#             SD_d13c  SD_d15n
# Arthropod 2.0550750 1.417745
# C4Plants  3.8064638 2.606882
# Lichen    0.9300000 2.290000
# MiddleC3  0.8845903 1.244990
# UpperC3   1.2798437 1.795272
 

Ответ №2:

Преобразование матрицы в фрейм данных соедините обе таблицы по именам строк, замените NA значение соответствующим значением и измените его обратно на матрицу.

 library(dplyr)
library(tibble)

ss. %>%
  as.data.frame() %>%
  rownames_to_column(var = 'name') %>%
  left_join(s.sds %>%
  as.data.frame() %>%
  rownames_to_column(var = 'name'), by = 'name') %>%
  transmute(name, 
            SD_d13c = coalesce(SD_d13c.x, SD_d13c.y), 
            SD_d15n = coalesce(SD_d15n.x, SD_d15n.y)) %>%
  column_to_rownames('name') %>%
  as.matrix() -> result

result

#            SD_d13c  SD_d15n
#Arthropod 2.0550750 1.417745
#C4Plants  3.8064638 2.606882
#Lichen    0.9300000 2.290000
#MiddleC3  0.8845903 1.244990
#UpperC3   1.2798437 1.795272