在R中的shapefile中删除行


12

我已将shapefile导入R,并将其加入到表中。我的shapefile包含所有人口普查ID,而我的表仅包含选定的人口普查ID。我现在正在尝试删除所有未匹配的行。

这是我的数据集的样子(我正在尝试删除所有带有NA的行,因此需要删除最后两行):

  CTUID   Cluster   Average
5350007.01  1       124.53
5350007.02  1       234.87
5350010.01  4       110.11
5350010.02  5       187.68
5350001     NA        NA
5350002     NA        NA

我尝试使用此行代码:

shape2[!(rowSums(is.na(shape2))==NCOL(shape2)),]

这给了我这个错误:

Error in rowSums(is.na(shape2)) : 
  'x' must be an array of at least two dimensions
In addition: Warning message:
In is.na(shape2) : is.na() applied to non-(list or vector) of type 'S4'

我对R不太熟练,因此我们将不胜感激。如果您可以包括一个简短的解释,那将是极好的。

Answers:


13

错误的信息部分是您操作的数据是S4类对象,因此包含插槽。这意味着您需要在包含数据框的相应插槽“ @data”上进行操作。

如果要删除具有NA值的“所有”行,则可以仅在数据帧插槽上使用na.omit。这确实会遍历sp对象,并删除其他插槽中的关联点/多边形。

shape@data <- na.omit(shape@data)

如果要删除特定列中带有NA的行,可以使用:

shape@data <- shape[!is.na(shape@data$col) ,]

****更新03/08/2016现在有一个对sp对象进行操作的本机合并功能。您可以使用与其他任何data.frame相同的方式来调用merge。但是,x参数是sp SpatailDataFrame类对象,而y是要合并的任何data.frame。我将原始答案留作参考。


我还应该指出,您不能使用merge函数来连接sp对象。合并功能在操作期间重新使用数据,该操作破坏了sp对象中的内部关系。不幸的是,这是没有广泛宣传的东西。要将数据帧合并到sp对象的@data插槽,可以按这种方式使用match。

shape@data = data.frame(shape@data, OtherData[match(sdata@data$IDS, OtherData$IDS),])

哪里; shape是形状文件,IDS是要合并的标识符,OtherData是要与shape合并的数据框。请注意,IDS在两个数据集中可以是不同的名称,但实际上必须是相同的值(不是模糊的)。

或者,您可以使用此功能。

join.sp.df <- function(x, y, xcol, ycol) {
  x$sort_id <- 1:nrow(as(x, "data.frame"))  
    x.dat <- as(x, "data.frame")  
     x.dat2 <- merge(x.dat, y, by.x = xcol, by.y = ycol)  
    x.dat2.ord <- x.dat2[order(x.dat2$sort_id), ]  
  x2 <- x[x$sort_id %in% x.dat2$sort_id, ]  
  x2.dat <- as(x2, "data.frame") 
    row.names(x.dat2.ord) <- row.names(x2.dat)  
  x2@data <- x.dat2.ord  
  return(x2)
}

哪里; x = sp SpatialDataFrame对象,y =要与x合并的数据框对象,xcol = sp对象中的合并列名称(需要引用),ycol =数据帧对象中的合并列名称(需要引用)。

由于某些原因,我无法评论@Kelly问题,因此我正在编辑原始答案。检查您正在运行哪个版本的R和sp?您可以运行SessionInfo()进行查找。操纵@data对象时,删除其他数据插槽中关联对象的行为仅在最近的几个sp版本中可用。如果未运行当前版本,请尝试使用“软件包”菜单下的“更新软件包”来更新软件包。如果运行> = Windows Vista,请确保以管理员身份运行。还要查看对象前后的尺寸,即dim(shape),它表示行数/列数。行数与要素对象的数目相对应。您可以通过检查空间对象中的行数是否与@data插槽中的行数匹配(即dim(shape);)来检查结果。


谢谢你的帮助!我重做空间连接,因为我确实使用了“合并”而不是“匹配”。我删除了所有NA行,但是在绘制图形时,形状仍然存在于shapefile中。为什么会这样呢?
凯利

在sp 1.0-15时,必须对此答案进行修正。现在,在传递sp类对象时,将调用sp特定版本的merge函数,假设您执行一对一匹配以使行尺寸与关联的插槽保持一致,则该sp可以正确执行。
杰弗里·埃文斯

7

随着软件包中的更新,我建议以下内容:

shape <- shape[!is.na(shape@data$col),]

在过去的版本中,这将导致“形状”被强制转换为data.frame。sp开发人员开始使一些标准的R方法可以在sp对象上工作是一件很高兴的事情。感谢您提供此更新。
杰弗里·埃文斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.