#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