我刚刚开始使用R,并且想使用ACF查看数据中的自相关。我的数据框(GL)看起来像这样
GL
well year month value area
684 1994 Jan 8.53 H
684 1994 Feb 8.62 H
684 1994 Mar 8.12 H
684 1994 Apr 8.21 H
684 1995 Jan 8.53 H
684 1995 Feb 8.62 H
684 1995 Mar 8.12 H
684 1995 Apr 8.21 H
684 1996 Jan 8.53 H
684 1996 Feb 8.62 H
684 1996 Mar 8.12 H
684 1996 Apr 8.21 H
101 1994 Jan 8.53 R
101 1994 Feb 8.62 R
101 1994 Mar 8.12 R
101 1994 Apr 8.21 R
101 1995 Jan 8.53 R
101 1995 Feb 8.62 R
101 1995 Mar 8.12 R
101 1995 Apr 8.21 R
101 1996 Jan 8.53 R
101 1996 Feb 8.62 R
101 1996 Mar 8.12 R
101 1996 Apr 8.21 R
我想:
1.使用lappy或某种循环来计算每口井的ACF(我的实际数据集大约有100口井和三组)
2.在每组的一张图上绘制每个孔的ACF值(以线的形式)(因此,在这种情况下,我将有两个Acf图H和R。
我可以使用split和lapply计算每个孔的ACF,例如
split <- split(GL$value,GL$well)
test <- lapply(split,acf)
但是以这种方式拆分不会保存区域信息。如果我这样分裂:
split1 <- split(GL,GL$well)
然后,我不知道如何对每个孔的值执行lapply。
答案 0 :(得分:1)
当您很好地分割数据时,
<!DOCTYPE html>
<html>
<title>Web Page Design</title>
<head>
</head>
<body>
<table id="table1"></table>
<script>
function createCell() {
var table = document.getElementById('table1');
var row = table.insertRow(0);
var cell1 = row.insertCell(0);
var cell2 = row.insertCell(1);
cell1.innerHTML = "NEW CELL1";
cell2.innerHTML = "NEW CELL2";
}
createCell();
</script>
</body>
</html>
spl1 <- split(GL, GL$well)
看起来像这样。
lapply
不过,我们可以使它更好一些。
当我们按列表编号执行lapply(spl1, function(x) acf(x$value))
时,我们得到一个“计数器”,通过它可以访问列表名称以将信息标题粘贴在一起。使用lapply
,我们可以设置图的排列。
par(mfrow=c(<rows>, <columns>))
结果
可能必须根据井的分组方式进行调整。
( 作为旁注: :更好地避免覆盖函数名称。使用par(mfrow=c(1, 2))
lapply(seq_along(spl1), function(x) acf(spl1[[x]]$value,
main=paste0("well ", names(spl1)[x], ", ",
"area ", unique(spl1[[x]]$area))))
并为结果赋予与函数相同的名称其他受欢迎的候选人是split()
,data
,df
,我们随时可以通过table
快速检查该名称是否“免费” ,例如?
。)
数据
?df
答案 1 :(得分:0)
您可以使用data.table
解决此问题:
让我们从数据开始(从您的数据稍作修改,因此每个well
会有不同的值):
structure(list(well = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L), .Label = c("101", "684"), class = "factor"), year = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("1994", "1995", "1996"), class = "factor"), month = structure(c(3L, 2L, 4L, 1L, 3L,
2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L, 3L, 2L, 4L, 1L), .Label = c("Apr", "Feb", "Jan", "Mar"), class = "factor"),
value = c(4.65144120692275, 8.98342372477055, 17.983893298544,
15.3687085728161, 8.9577708535362, 7.47583840973675, 16.6564453896135, 11.6158618542831, 23.6109819535632, 14.1604918171652, 11.3882310683839, 20.4579487598967, 3.31275907787494, 22.109053656226, 13.598402187461, 12.3686389743816, 17.9585587936454, 17.3689122993965, 7.38424337399192, 6.93579732463695, 13.2789171519689, 21.2500206897967, 13.5766511948314, 3.58588649751619), area = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("H", "R"), class = "factor")), row.names = c(NA, -24L), class = c("data.table", "data.frame"))
然后我们为每个well
创建一个列表:
GL[, datos := .(list(value)) , by = well]
datos
变量中的每一行都有一个列表,其中包含与well
对应的所有值,因此我们可以删除其中的大部分,并仅保留每个well
的第一行,因为它已经具有所有信息。这是通过GL[, .SD[1,], by = well]
完成的,因此结果将是两行数据表。之后,我们可以链接另一个将生成并保存每个图的表达式:
GL[, .SD[1,], by = well][
, {png(filename = paste0(well, "-", area, ".png"),
width = 1600,
height = 1600,
units = "px",
res = 100);
plot(a[[1]], main = paste("Well:", well,
"Area:", area, sep = " "));
dev.off()},
by = well]
您的两个图将以“ 684-H.png”和“ 101-R.png”的名称保存在当前目录中。
关键点在这里:data.table
不仅需要函数,而且需要表达式,因此绝对有可能生成图并将其保存到任何给定位置。