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

时间:2012-05-17 23:38:41

标签: 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              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

我需要一些帮助来理清如何执行此错误检查并调整我的代码才能执行此操作!!!

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

干杯,杰斯

1 个答案:

答案 0 :(得分:3)

就是这一行:

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

您想查看n的{​​{1}}行和Lat / Lon列是否为NA。

要访问行myData3n,您可以:

Lat

或(对于数据框):

myData3[n,'Lat']

要测试某些内容是否为NA(数据缺失),请使用myData3$Lat[n] (请参阅is.na)。

所以:

?is.na

应该有效。 (注意if ( is.na(myData$Lat[n]) && is.na(myData$Lon[n]) ) 是'和'运算符/逻辑快捷方式。&&版本比较(例如)向量元素,其中&c(TRUE, TRUE, FALSE) & c(FALSE, TRUE, FALSE) - 在标量上使用它没有意义。)


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

例如,c(FALSE, TRUE, FALSE)其中x + 5是一个向量,会将x添加到 5的每个元素,这意味着您没有为从{1}到x的每个x[i] + 5编写一个循环i

在上面,您可以在length(x)中生成行号的向量,其中Lat和Lon不是这样的:

myData3

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

然后要绘制,你可以像这样一起将有效行全部输入FALSE

text

这是因为大多数R函数都是矢量化的,所以你可以输入一个完整的向量,它会循环遍历每个元素。

请注意,text(myData3$Lat[idx],myData3$Lon[idx],myData3$No.of.Documents[idx],adj=0.5) 会选出myData3$Lat[idx]myData3$Lat为TRUE的行,即Lat和Lon都存在的行。

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