我正在尝试将一个矩阵中的 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 值。这些值取决于植被类别。如果在站点中未找到某个类别,则该类别不会列在站点矩阵中。
显然我可以手动完成每次迭代,但如果可能的话,我想学习更多地自动化这样的事情。
答案 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}}