“合并数据帧”;不是类数据中的插槽。frame“;

“合并数据帧”;不是类数据中的插槽。frame“;,r,sp,R,Sp,我使用T.Hengl的《地质统计学制图实用指南》一书,该书也提供了重现结果的方法。不幸的是,所包含的代码负载已被弃用,甚至已失效。我能够恢复大部分代码,但现在我只能做一些看似简单的事情:合并两个数据帧。我的错误: Error in (function (cl, name, valueClass) : ‘data’ is not a slot in class “data.frame” 下面是重现该错误的代码: library(gstat) library(rgdal) library(s

我使用T.Hengl的《地质统计学制图实用指南》一书,该书也提供了重现结果的方法。不幸的是,所包含的代码负载已被弃用,甚至已失效。我能够恢复大部分代码,但现在我只能做一些看似简单的事情:合并两个数据帧。我的错误:

Error in (function (cl, name, valueClass)  :   ‘data’ is not a slot in class “data.frame”
下面是重现该错误的代码:

library(gstat)
library(rgdal)
library(sp)

# load the data:
data(meuse)
coordinates(meuse) <- ~x+y
proj4string(meuse) <- CRS("+init=epsg:28992")
download.file("http://spatial-analyst.net/book/system/files/meuse.zip", destfile=paste(getwd(), "meuse.zip", sep="/"))
grid.list <- c("ahn.asc", "dist.asc", "ffreq.asc", "soil.asc")
# unzip the maps in a loop:
for(j in grid.list){
  fname <- unzip("meuse.zip", file=j)
  print(fname)
  file.copy(fname, paste("./", j, sep=""), overwrite=FALSE)
}

# load grids to R:
meuse.grid <- readGDAL(grid.list[1])
# fix the layer name:
names(meuse.grid)[1] <- sub(".asc", "", grid.list[1])
for(i in grid.list[-1]) {
  meuse.grid@data[sub(".asc", "", i[1])] <- readGDAL(paste(i))$band1
}
names(meuse.grid)
proj4string(meuse.grid) <- CRS("+init=epsg:28992")

meuse.ov <- over(meuse, meuse.grid)
str(meuse.ov)
meuse.data <- meuse[c("zinc", "lime")]@data
str(meuse.data)
meuse.ov@data <- merge(meuse.ov, meuse.data)

我试图通过查找stackoverflow来解决这个问题,但没有任何效果。书中的(不起作用的)遗留代码表明了这一点(为了您的理解):


meuse.ov这与您在数据帧上使用
@
有关
@
通常用于访问数据帧没有的插槽。请尝试
foo什么是“@”运算符?您不应该使用“$”吗,因为它只是一个data.frame?meuse.grid是一个带有坐标的空间点数据框架,因此这里的结构更复杂,有一个嵌套结构和5个“插槽”。检查
str(meuse.grid)
。这不应该是我的问题。
meuse.grid
确实有插槽,也可以有插槽。但是,
mouse.ov
mouse.data
都是不能有槽的常规数据帧。这就是为什么您会得到一个错误,
@data
不是类
data.frame
中的插槽。编辑:更加完整:
meuse.grid
是一个S4对象(请尝试
isS4(meuse.grid)
),没问题!我将该线程标记为需要关闭,因为“解决方案是一个简单的印刷错误”,只是为了确保人们知道问题已经得到了回答。编辑:另外,@PawełSopel,如果你仔细阅读S3和S4对象(它们之间的差异),你会找到答案。
> str(meuse.ov)
'data.frame':   155 obs. of  4 variables:
 $ ahn  : int  3214 3402 3277 3563 3406 3355 3428 3476 3522 3525 ...
 $ dist : num  0.00136 0.01222 0.10303 0.19009 0.27709 ...
 $ ffreq: int  1 1 1 1 1 1 1 1 1 1 ...
 $ soil : int  1 1 1 2 2 2 2 1 1 2 ...
> str(meuse.data)
'data.frame':   155 obs. of  2 variables:
 $ zinc: num  1022 1141 640 257 269 ...
 $ lime: Factor w/ 2 levels "0","1": 2 2 2 1 1 1 1 1 1 1 ...
meuse.ov <- overlay(meuse.grid, meuse)
meuse.ov@data <- cbind(meuse.ov@data, meuse[c("zinc", "lime")]@data)