1

我正在使用 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
  }
}

更改代码时收到以下错误消息:

  Error in matrix(unlist(value, recursive = FALSE, use.names = FALSE), nrow = nr,  : 
 'data' must be of a vector type

  Error in 0 = while (data < 1000) { : 
  invalid (do_set) left-hand side to assignment

我需要一些帮助来弄清楚如何进行错误检查并调整我的代码以便能够做到这一点!!!

任何进一步的问题,请不要犹豫,问。

干杯,杰斯

4

1 回答 1

3

就是这一行:

if (myData3["Lat", 0] & myData3["Lon", 0])

您想查看n第 th 行和 Lat/Lon 列myData3是否为 NA。

要访问行列nLat您可以:

myData3[n,'Lat']

或(对于数据框):

myData3$Lat[n]

要测试某事是否为 NA(数据丢失),请使用is.na(请参阅 参考资料?is.na)。

所以:

if ( is.na(myData$Lat[n]) && is.na(myData$Lon[n]) )

应该管用。(请注意,&&这是“和”运算符/逻辑快捷方式。&版本比较(例如)向量element-wise,即c(TRUE, TRUE, FALSE) & c(FALSE, TRUE, FALSE)——c(FALSE, TRUE, FALSE)在标量上使用它没有意义)。


以上将解决您的问题,但进一步说明您的代码:R 是一种矢量化语言,这意味着很多时候您可以假装您的值是标量并使用相同的代码,而不是循环。

例如,向量x + 5在哪里x将添加5到 的每个元素x这意味着您不必x[i] + 5i从 1 到的每个元素编写循环length(x)

在上面,您可以生成一个行号向量,myData3其中 Lat 和 Lon 不是 na,如下所示:

idx = !is.na(myData3$Lat) & !is.na(myData3$Lon)

在这里,idx将是一个 TRUE 和 FALSE 的向量,它与 in 中的行数一样长myData3(注意我&在这里使用而不是&&获取元素和)。 idx将是TRUELat 和 Lon 都不NA 的地方,FALSE否则。

text然后进行绘图,您可以像这样一次将有效行输入全部:

text(myData3$Lat[idx],myData3$Lon[idx],myData3$No.of.Documents[idx],adj=0.5)

这是因为大多数 R 函数都是向量化的,因此您可以输入整个向量,它将具有循环遍历每个元素的效果。

请注意,myData3$Lat[idx]挑选出myData3$Lat其中idx为 TRUE 的那些行,即 Lat 和 Lon 都存在的那些行。

如果这是您第一次使用矢量化语言(如 R 和 Matlab),请不要担心,您最终会掌握它的窍门。好有趣!

于 2012-05-17T23:57:20.960 回答