使用矩阵填充另一个矩阵中的 NA 值

时间:2021-07-02 06:46:20

标签: 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

在示例中,我想替换 ss 的“地衣”行中的 NA 值。使用 s.sds 中的“地衣”值,鉴于 ss 中的行数,无法弄清楚如何在循环中自动执行此操作。将变化(2-7 行)而 s.sds 中的行数保持为 7。

也许我需要遍历所有迭代并使它们都有七行,以便行号匹配?除非我不能在不扭曲我的数据的情况下做到这一点。此代码的目的是用站点标准偏差值替换 NA 值。这些值取决于植被类别。如果在站点中未找到某个类别,则该类别不会列在站点矩阵中。

显然我可以手动完成每次迭代,但如果可能的话,我想学习更多地自动化这样的事情。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

将矩阵转换为数据框按行名连接两个表,将 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 值替换为相应的值并将其改回矩阵。

{{1}}