【问题标题】:Replace NaN's of one matrix with values of another matrix in R用 R 中另一个矩阵的值替换一个矩阵的 NaN
【发布时间】:2016-09-10 21:58:21
【问题描述】:

我有一个 100 x 100 矩阵,其中有 1800 个缺失值,由 NaN 表示。我还有另一个 1800 x 1 矩阵,其中包含所有这些缺失值。我想将这些值从我的 1800 x 1 矩阵插入到第一个矩阵。

我试过了;

data_matrix[is.na(data_matrix)] <- predicted_values[1,]

但这不起作用。

也许最安全的选择是根据行/列名称进行操作?因为我的两个矩阵都有相应的行/列名称。这是我的意思的一个例子:

数据矩阵

  VAL.T  VAL.U  VAL.V  VAL.W
A 10.5   NaN    203    902
B 20.9   343    12     NaN
C 32     22     NaN    90
D 12     NaN    NaN    23.1

predicted_values

VAL.U:A 65
VAL.W:B 21
VAL.V:C 23.9
VAL.U:D 11.1
VAL.V:D 78

predicted_values 中值的排列顺序可能也有帮助:即,predicted_values 中的值的排列方式就像我们从 data_matrix 中第一行的开头移动到 first_row 的末尾,然后移动到下一行.这就是 NaN 值应该被替换的方式。

【问题讨论】:

  • 你有predicted_values的data.frame吗?还是行名称为VAL.U:A 等的矩阵?
  • predicted_values 是具有上述行名称 (VAL.U:A) 等的矩阵。data_matrix 是具有行名称如 A、B 等和列名称为 VAL 的矩阵.U等。因此predicted_values的行名是data_matrix的列名和行名,用冒号隔开。
  • 如果第二个矩阵中的值已经排序(如示例所示),那么data_matrix[is.na(data_matrix)] &lt;- predicted_values[,1] 应该可以工作。注意[,1]
  • 它根本不起作用,它用重复的值填充 NA,即所有 NAN 都被替换为 predict_values 中的第一个值。
  • 根据您的输入示例,它适用于我

标签: r matrix nan na missing-data


【解决方案1】:

使用将第一个 predval 列作为第一个(单个)参数拆分为“[

idxm <- cbind( sapply( strsplit(as.character(predval$V1), ":"), "[",2), 
                 sapply( strsplit(as.character(predval$V1), ":"), "[",1) )
dtm[ idxm ] <- predval$V2
dtm
#-----------
  VAL.T VAL.U VAL.V VAL.W
A  10.5  65.0 203.0 902.0
B  20.9 343.0  12.0  21.0
C  32.0  22.0  23.9  90.0
D  12.0  11.1  78.0  23.1



dput(predval)
structure(list(V1 = structure(c(1L, 5L, 3L, 2L, 4L), .Label = c("VAL.U:A", 
"VAL.U:D", "VAL.V:C", "VAL.V:D", "VAL.W:B"), class = "factor"), 
    V2 = c(65, 21, 23.9, 11.1, 78)), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
-5L))

dput(dtm)
structure(c(10.5, 20.9, 32, 12, 65, 343, 22, 11.1, 203, 12, 23.9, 
78, 902, 21, 90, 23.1), .Dim = c(4L, 4L), .Dimnames = list(c("A", 
"B", "C", "D"), c("VAL.T", "VAL.U", "VAL.V", "VAL.W")))

【讨论】:

    【解决方案2】:

    由于predicted_values 按行然后按列存储值,而矩阵通常按列存储它们的值,您应该进行转置。

    a=t(data_matrix)
    a[is.na(a)]=predicted_values[,1]
    data_matrix=t(a)
    

    【讨论】:

    • 这是一个非常脆弱的策略。它完全取决于数字 和 predict_values 对象中值的排序顺序与 NA 位置完全“同步”。它没有使用第一列中的信息。当我们谈到秩序的话题时,为什么不这样做:a[is.na(a)]=predicted_values[,2]?
    • 明确告知“在 predict_values 中排列值的顺序可能也有帮助:即,predicted_values 中的值的排列方式就像我们从 data_matrix 中第一行的开头移动一样到 first_row 的末尾,然后移动到下一行。这就是 NaN 值应该被替换的方式。我利用了这个。
    • "为什么不这样:a[is.na(a)]=predicted_values[,2]" - 因为 predict_values 只有一列。
    • 我使用了 read.table 并且没有标题,它被读取为 2 列,但我现在在 cmets 中看到了该描述。
    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多