错误的信息部分是您操作的数据是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);)来检查结果。