R 使用If和While循环检查数据文件中的列时出错
我使用While循环和If语句在图形上生成文本 我试图使用If语句作为错误检查。如果Lon和Lat列中没有数据,则跳过此列并移到下一行 在我的数据表中,Lat和Lon列中没有值,这就是为什么它们显示为NA,如下所示: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
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)