R 使用If和While循环检查数据文件中的列时出错

R 使用If和While循环检查数据文件中的列时出错,r,R,我使用While循环和If语句在图形上生成文本 我试图使用If语句作为错误检查。如果Lon和Lat列中没有数据,则跳过此列并移到下一行 在我的数据表中,Lat和Lon列中没有值,这就是为什么它们显示为NA,如下所示: myData3[1:7,] ISO3V10 Country No.of.Documents Lat Lon 1 AGO Angola 0 NA NA 2 ALB

我使用While循环和If语句在图形上生成文本

我试图使用If语句作为错误检查。如果Lon和Lat列中没有数据,则跳过此列并移到下一行

在我的数据表中,Lat和Lon列中没有值,这就是为什么它们显示为NA,如下所示:

  myData3[1:7,]
  ISO3V10              Country No.of.Documents Lat Lon
1     AGO               Angola               0  NA  NA
2     ALB              Albania               0  NA  NA
3     ARE United Arab Emirates               0  NA  NA
4     ARG            Argentina               7  NA  NA
5     ARM              Armenia               0  NA  NA
6     AUS            Australia              96 151 -34
7     AUT              Austria              28  NA  NA
到目前为止,我编写的代码如下:

 myData3 <- read.delim(file="C:\\Documents\\RScriptAnalysis\\noofpublications3.txt", header = TRUE, sep = "\t")
 data = 0
 n = 0
 while(data < 100){
 if (myData3["Lat", 0] & myData3["Lon", 0])
   {
   data = data +1
   n = n +1
   }
else {
  text(myData3[n,"Lat"],myData3[n,"Lon"],myData3[n,"No.of.Documents"],adj=0.5)
  n = n +1
  data = data +1
  }
}
myData3这是一行:

if (myData3["Lat", 0] & myData3["Lon", 0])
您想查看
myData3
n
th行和Lat/Lon列是否为NA

要访问行
n
Lat
,需要执行以下操作:

myData3[n,'Lat']
或(对于数据帧):

要测试某个内容是否为NA(数据缺失),请使用
is.NA
(请参见
?is.NA

因此:

应该有用。(注意
&
是“and”运算符/逻辑快捷方式。
&
版本比较(例如)向量元素,其中
c(真、真、假)&c(假、真、假)
c(假、真、假)
——在标量上使用它没有意义)


上面的内容将解决您的问题,但代码中需要进一步注意:R是一种矢量化语言,这意味着在很多时候,您可以假装自己的值是标量,而不是循环,并使用相同的代码

例如,
x+5
其中
x
是一个向量,将
5
添加到
x
的每个元素中,这意味着您不必为每个
i
写一个从1到
长度(x)
的循环

在上面的示例中,您可以在
myData3
中生成行号向量,其中Lat和Lon与na不同:

idx = !is.na(myData3$Lat) & !is.na(myData3$Lon)
这里,
idx
将是一个与
myData3
中的行数相同的真与假向量(注意,我在这里使用了
&
而不是
&&
来获得元素和)。
idx
将为
TRUE
,其中Lat和Lon都不是NA,否则为
FALSE

然后,要进行打印,您可以一次将有效行全部输入到
文本中,如下所示:

text(myData3$Lat[idx],myData3$Lon[idx],myData3$No.of.Documents[idx],adj=0.5)
这是因为大多数R函数都是矢量化的,所以可以输入整个向量,这样就可以在每个元素上循环

请注意,
myData3$Lat[idx]
选择
myData3$Lat
idx
为真的行,即Lat和Lon同时存在的行


如果这是你第一次使用矢量化语言(如R和Matlab),别担心,你最终会掌握它的窍门的。真有趣

我将您的编辑回滚到以前的版本。如果你有一个新问题,你应该把它作为一个单独的问题来问,而不是编辑这个问题。
if ( is.na(myData$Lat[n]) && is.na(myData$Lon[n]) )
idx = !is.na(myData3$Lat) & !is.na(myData3$Lon)
text(myData3$Lat[idx],myData3$Lon[idx],myData3$No.of.Documents[idx],adj=0.5)