【问题标题】:R ignore missing dataR忽略丢失的数据
【发布时间】:2014-06-17 17:52:02
【问题描述】:

我有两个 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)
  }
 }
}

由于 NA,我收到此错误。

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

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

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

【问题讨论】:

  • 首先要做的可能是放弃for 循环。第二个是a reproducible example
  • 也许您应该为此使用?which 并使用索引返回并提取数据

标签: r na


【解决方案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

【讨论】:

    【解决方案2】:

    如果没有 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
    

    然后运行你的双循环

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2017-05-31
      • 1970-01-01
      相关资源
      最近更新 更多