将NA单元位置复制到另一个数据帧中

时间:2016-01-24 20:47:00

标签: r matrix

我有两个实体:矩阵和数据帧。 Matrix在所有单元格中都有数字。第二个数据帧在几个单元格中具有NA。如何确保第一个矩阵的NA与后一个数据帧中的NA位置相同。

我尝试了complete.case()和na.omit,但遗憾的是这一切都删除了所有行。我尝试了一个for循环,它按行逐行迭代,检查单元格为零的位置,然后返回位置,然后输入indp数据帧 - 得到一些围绕维度的错误:

贯穿我的逻辑。这一次迭代一列然后行;在单元格包含0的情况下,然后在indp矩阵中取相同的单元格位置并设置为0 - 但似乎没有发生任何事情。

numZero <- 0 
cols <- 0    
for (i in 1:ncol(ws)){
  for (k in 1:nrow(ws)){
    if (is.na(ws[k,i])){
      print(indp[i,k])
      indp[i,k] <- 0  
      numZero <- numZero + 1
    }

  }
  cols <- cols +1
}

应该注意,indp是一个矩阵。

添加了cols和numzero以保留行数和列数的选项卡,因为我不断收到以下错误: indp [i,k]:下标超出界限时出错。 indp和ws具有相同的尺寸。但是,col和numzero计数器返回与维度不同的cols和rows。 indp矩阵也没有发生任何事情。我错过了什么吗?

还附上两者的图片以帮助概念化: indp

注意0: ws

希望执行以下操作: 原始矩阵:

    [,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   21
[2,]    2    7   12   17   22
[3,]    3    8   13   18   23
[4,]    4    9   14   19   24
[5,]    5   10   15   20   25

数据框:

  V1 V2 V3 V4 V5
1  1  5  1  0 NA
2  3  3  1  2  2
3  0  1  5  4 NA
4  5 NA  3  2  0
5 NA  0  3  4  1

我希望第一个矩阵按照上面的说法 - 让NAs完全在同一个单元格中:

[,1] [,2] [,3] [,4] [,5]
[1,]    1    6   11   16   NA
[2,]    2    7   12   17   22
[3,]    3    8   13   18   NA
[4,]    4   NA   14   19   24
[5,]   NA   10   15   20   25

除此之外,

m1 <- matrix(1:25, 5, 5);set.seed(25); 
dat1 <- as.data.frame(matrix(sample(c(NA,0:5), 5*5, replace=TRUE), ncol=5))
numZero <- 0 
cols <- 0    
for (i in 1:ncol(dat1)){
  for (k in 1:nrow(dat1)){
    if (is.na(dat1[k,i])){
      print(dat1[i,k])
      m1[i,k] <- 0  
      numZero <- numZero + 1
    }
    else{
      print(dat1[i,k])
    }

  }
  cols <- cols +1
}

在每次迭代时打印单元格条目以与原始数据实体进行比较,但是我得到的不同的数字是它们中的内容,这是奇怪的,因为我认为m1 [1,1],例如应该返回单元格条目。

1 个答案:

答案 0 :(得分:0)

我们可以使用is.na(dat1)获取逻辑矩阵,提取&#39; m1&#39;对应于逻辑矩阵的TRUE值并将其分配给NA

m1[is.na(dat1)] <- NA
m1
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    6   11   16   NA
#[2,]    2    7   12   17   22
#[3,]    3    8   13   18   NA
#[4,]    4   NA   14   19   24
#[5,]   NA   10   15   20   25