如何在一张图上绘制多个ACF值

时间:2019-04-04 22:28:56

标签: r plot time-series lapply

我刚刚开始使用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。

2 个答案:

答案 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>))

结果

enter image description here

可能必须根据井的分组方式进行调整。

作为旁注: :更好地避免覆盖函数名称。使用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()datadf,我们随时可以通过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不仅需要函数,而且需要表达式,因此绝对有可能生成图并将其保存到任何给定位置。