在两个数组之间匹配NA

时间:2017-07-19 17:05:26

标签: r

我有2个数组,X和Y.X有很多NA,其中Y有值。我想用N替换Y中的值以与X中的NA相对应,我想使用此函数来循环许多文件。我尝试了ifelse,但产生了所有的NA。我试过Cbind,但仍然没有成功,见下文。请有人告诉我代码

           Jan  Feb  Mar  Apr  May  Jun  Jul 
    [1,]   NA   NA   NA   NA   NA   NA -5.5 
    [2,]   NA   NA   NA   NA   NA   NA   NA   
    [3,]   NA   NA   NA   NA   NA   NA   NA   
    [4,]   NA   NA   NA   NA   NA   NA   NA   
    [5,]   NA   NA   NA   NA   NA   NA   NA   
    [6,] 24.4 24.9 22.9 21.9 19.5 20.1 18.1 
   > head(Y)
           Jan   Feb   Mar   Apr   May   Jun   Jul  
   [1,]    NA    NA    NA    NA    NA    NA 18.47 
   [2,] 22.17 22.57 22.54 21.88 20.45 19.35 18.23
   [3,] 22.07 23.10 22.78 21.73 20.38 19.16 18.54 
   [4,] 22.48 23.09 21.68 20.59 19.84 19.00 19.54 
   [5,] 20.79 22.32 22.16 22.05 20.27 20.25 18.55 
   [6,] 23.03 23.27 23.52 21.74 20.81 19.96 18.38 

2 个答案:

答案 0 :(得分:1)

您可以在矩阵(或数组)上使用is.na来识别缺少的元素。然后,有选择地更新所需矩阵的元素,这些元素对应于另一个矩阵中的缺失值。

# Generate sample data
set.seed(1)
m <- 6
n <- 7

# A matrix with lots of missing values
X <- matrix(sample(c(NA, 1:3), size = m*n, replace = TRUE, prob = c(.7, .1, .1, .1)), ncol = n)
X
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   NA   NA    2   NA    3   NA
[2,]   NA   NA   NA   NA   NA    2
[3,]   NA   NA    2   NA   NA   NA
[4,]    1   NA    1   NA   NA    2
[5,]   NA   NA   NA   NA   NA   NA
[6,]    3   NA    2   NA   NA    3
[7,]    1   NA    1   NA    3   NA

# A matrix with fewer missing values
Y <- matrix(sample(c(NA, 4:6), size = m*n, replace = TRUE), ncol = n)
Y
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    6    5    4    4    4    4
[2,]    5    4    5    5    6    6
[3,]    5    6    5    4    4    6
[4,]    6    4    4    4    4    4
[5,]   NA   NA    6    6    4    5
[6,]    4   NA    4   NA    6    4
[7,]    5   NA    4    6    6    4


# The key is that using is.na on a matrix returns a logical matrix

is.na(Y)
      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]
[1,] FALSE FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE FALSE
[5,]  TRUE  TRUE FALSE FALSE FALSE FALSE
[6,] FALSE  TRUE FALSE  TRUE FALSE FALSE
[7,] FALSE  TRUE FALSE FALSE FALSE FALSE

# Set Y missing where X is missing

 Y[is.na(X)] <- NA

# Show new Y
Y
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]   NA    5   NA   NA   NA   NA    6
[2,]   NA   NA   NA    4   NA   NA   NA
[3,]   NA   NA    4    4   NA   NA    4
[4,]    6   NA   NA   NA   NA   NA   NA
[5,]   NA   NA    5   NA    4    6    4
[6,]    4   NA    4   NA   NA   NA   NA

答案 1 :(得分:0)

如果您希望对同一维度的两个数据框执行此操作,则可以使用此功能。

m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
n <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
y <- which(is.na(m) == TRUE) #index na's
m[y] <- n[y] #replace na's

我不清楚如何在多个数据帧上循环这个,你能提供一个例子吗?