R忽略丢失的数据

时间:2014-06-17 17:52:02

标签: r ignore na

我有两个R数据文件,每个文件有100列,但每个data1和data2中的行号从220到360不等。 data1和data2表示在一组实验期间两个量变化的变化。所以data1的[i,j]和data2的[i,j]代表相同的事件,但是会有不同的值。我想打印任何文件中大于2.5的数据,以及列号和行号

for (i in 1:360){
  for (j in 1:100){
  if((data1[i,j]>2.5) | ( data2[i,j]>2.5)) {
    cat(i, j, data1[i,j],  data2[i,j], "\n", file="extr-b2.5.txt", append=T)
  }
 }
}

由于NAs,我收到此错误。

Error in if ((data1[i, j] > 2.5) | (data2[i, j] >  : 
  missing value where TRUE/FALSE needed

如果我将i设置为1:220(每列至少有220行),它可以正常工作。

如何修改上述代码以忽略NA值。

2 个答案:

答案 0 :(得分:1)

我会这样:

idx <- which(dat1>2.5 & dat2>2.5,arr.ind=TRUE)
cbind(idx,v1=dat1[idx],v2=dat2[idx])

可重现的例子:

set.seed(1)
dat1 <- as.data.frame(matrix(runif(12,1,5),ncol=3))
dat2 <- as.data.frame(matrix(runif(12,1,5),ncol=3))
idx <- which(dat1>2.5 & dat2>2.5,arr.ind=TRUE)
cbind(idx,v1=dat1[idx],v2=dat2[idx])

#      row col       v1       v2
# [1,]   3   1 3.291413 4.079366
# [2,]   4   1 4.632831 2.990797
# [3,]   2   2 4.593559 4.967624
# [4,]   3   2 4.778701 2.520141
# [5,]   4   2 3.643191 4.109781
# [6,]   1   3 3.516456 4.738821

其中dat1和dat2:

# dat1
# V1       V2       V3
# 1 2.062035 1.806728 3.516456
# 2 2.488496 4.593559 1.247145
# 3 3.291413 4.778701 1.823898
# 4 4.632831 3.643191 1.706227
# > dat2
# V1       V2       V3
# 1 3.748091 3.870474 4.738821
# 2 2.536415 4.967624 1.848570
# 3 4.079366 2.520141 3.606695
# 4 2.990797 4.109781 1.502220

答案 1 :(得分:0)

如果没有for循环,您可以使用pmax来比较两个数组。

 bigger=pmax(data1,data2) 

这给出了一个具有最大值的数组。然后你可以检查max是否大于2.5

 which( bigger>2.5,arr.ind=T) 

将给出max大于截止值的位置。

为了完整性,如果我在双循环框架中执行它,我只需将Missing值设置为低于所有其他数据的min,只要你的某个值低于2.5,这将有效。数据

lowest=min(c(data1,data2))
data1[which(is.na(data1),arr.ind=T)]=lowest

然后运行你的双循环