R 忽略丢失的数据

R 忽略丢失的数据,r,ignore,na,R,Ignore,Na,我有两个R数据文件,每个文件有100列,但每个data1和data2的行号从220到360不等。数据1和数据2表示在一组实验中两个数量变化的变化。因此,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[

我有两个R数据文件,每个文件有100列,但每个data1和data2的行号从220到360不等。数据1和数据2表示在一组实验中两个数量变化的变化。因此,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值。

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

 bigger=pmax(data1,data2) 
这将提供一个具有最大值的数组。然后您可以检查最大值是否大于2.5

 which( bigger>2.5,arr.ind=T) 
将给出最大值大于截止值的位置

为了完整性,如果我在您的双循环框架中执行此操作,我只会将缺少的值设置为低于所有其他数据的最小值,只要数据中的某个值低于2.5,这将起作用

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

然后运行双循环

我想这样做:

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

要做的第一件事可能是放弃
for
循环。第二种可能是您应该使用
?对于这一点,可以使用索引返回并提取数据
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
# 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