我有两个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值。
答案 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
然后运行你的双循环