如何将动物园对象列表转换为数据框?
How to convert a list of zoo objects to a dataframe?
我正在尝试组织我的数据集以供后续分析(趋势分析、绘图等)。数据采用列表形式,我想将其转换为数据框。
我的完整数据集将包含大约 300 口井和 40 年的数据。每口井都有不同的记录长度,即有些井有 40 年的记录,有些有 5 年。对于这个例子,我只使用了两口井和 1 年的数据。
从其他帖子中,我设法将动物园对象合并在一起,为每个井创建了一个列。但是我希望这些列也包含网站名称。
我确实注意到 date/time 似乎不在其自己的专栏中;我不确定这是否会在以后出现问题。同样值得关注的是我将通过将所有 date/time 值合并在一起生成的 date/time 值的数量。我想知道是否有比我计划的更好的方法。
dput(z)
list(structure(c(-3.221, -3.601, -3.321, -2.861, -2.661, -2.491,
-2.297, -2.373, -2.348, -2.216, -2.569, -2.676), SiteName = "Well..3737 7D Flaxmere", Measurement = "Depth From Land Surface", Units = "m", InterpolationMethod = "Quasi-continuous", DataType = "SimpleTimeSeries", TSType = "StdSeries", class = "zoo", index = structure(c(1515061200L,
1517484600L, 1519901100L, 1522761900L, 1525177200L, 1528199400L,
1530619800L, 1533209100L, 1535978400L, 1538994000L, 1541071500L,
1544693700L), class = c("POSIXct", "POSIXt"), tzone = "UTC")),
structure(c(4.30654362318781, 3.08465060629183, 3.69719825206464,
4.22951094416319, 4.74166852727183, 5.25868509480613, 5.37266948414152,
5.24168682648358, 5.09669530682964, 4.71066298287734, 5.05269565318106,
4.74566920516198), SiteName = "Well...222 Comminutor Stn", Measurement = "Depth From Land Surface", Units = "m", InterpolationMethod = "Quasi-continuous", DataType = "SimpleTimeSeries", TSType = "StdSeries", class = "zoo", index = structure(c(1515139200L,
1517491200L, 1519898400L, 1522762800L, 1525179600L, 1528186800L,
1530528900L, 1533199500L, 1535962200L, 1539082200L, 1541160300L,
1544786400L), class = c("POSIXct", "POSIXt"), tzone = "UTC")))
这是我迄今为止尝试过的方法,它接近于工作 - 除了我没有列名
test1 <- data.frame(setNames(do.call(cbind, unname(z)), names(z)))
我希望输出看起来像这样。
head(test1)
Date/Time Well...222 Comminutor Stn Well..3737 7D Flaxmere
2018-01-04 10:20:00 -3.221 NA
2018-01-05 08:00:00 NA 4.306544
2018-02-01 11:30:00 -3.601 NA
2018-02-01 13:20:00 NA 3.084651
2018-03-01 10:00:00 NA 3.697198
2018-03-01 10:45:00 -3.321 NA
但目前看起来像这样
X1 X2
2018-01-04 10:20:00 -3.221 NA
2018-01-05 08:00:00 NA 4.306544
2018-02-01 11:30:00 -3.601 NA
2018-02-01 13:20:00 NA 3.084651
2018-03-01 10:00:00 NA 3.697198
2018-03-01 10:45:00 -3.321 NA
这个怎么样
library(zoo)
Reduce(function(x, y) merge(x, y, all = T), lapply(z, function(x)
cbind(`Date/Time` = index(x), setNames(data.frame(x), attr(x, "SiteName")))))
# Date/Time Well..3737 7D Flaxmere Well...222 Comminutor Stn
#1 2018-01-04 10:20:00 -3.221 NA
#2 2018-01-05 08:00:00 NA 4.306544
#3 2018-02-01 11:30:00 -3.601 NA
#4 2018-02-01 13:20:00 NA 3.084651
#5 2018-03-01 10:00:00 NA 3.697198
#6 2018-03-01 10:45:00 -3.321 NA
#7 2018-04-03 13:25:00 -2.861 NA
#8 2018-04-03 13:40:00 NA 4.229511
#9 2018-05-01 12:20:00 -2.661 NA
#10 2018-05-01 13:00:00 NA 4.741669
#11 2018-06-05 08:20:00 NA 5.258685
#12 2018-06-05 11:50:00 -2.491 NA
#13 2018-07-02 10:55:00 NA 5.372669
#14 2018-07-03 12:10:00 -2.297 NA
#15 2018-08-02 08:45:00 NA 5.241687
#16 2018-08-02 11:25:00 -2.373 NA
#17 2018-09-03 08:10:00 NA 5.096695
#18 2018-09-03 12:40:00 -2.348 NA
#19 2018-10-08 10:20:00 -2.216 NA
#20 2018-10-09 10:50:00 NA 4.710663
#21 2018-11-01 11:25:00 -2.569 NA
#22 2018-11-02 12:05:00 NA 5.052696
#23 2018-12-13 09:35:00 -2.676 NA
#24 2018-12-14 11:20:00 NA 4.745669
这从 zoo
对象的 "SiteName"
属性中提取列名。
PS。包含 "special" 个字符的列名通常不是一个好主意,它们需要 "backticking"。
我正在尝试组织我的数据集以供后续分析(趋势分析、绘图等)。数据采用列表形式,我想将其转换为数据框。
我的完整数据集将包含大约 300 口井和 40 年的数据。每口井都有不同的记录长度,即有些井有 40 年的记录,有些有 5 年。对于这个例子,我只使用了两口井和 1 年的数据。
从其他帖子中,我设法将动物园对象合并在一起,为每个井创建了一个列。但是我希望这些列也包含网站名称。
我确实注意到 date/time 似乎不在其自己的专栏中;我不确定这是否会在以后出现问题。同样值得关注的是我将通过将所有 date/time 值合并在一起生成的 date/time 值的数量。我想知道是否有比我计划的更好的方法。
dput(z)
list(structure(c(-3.221, -3.601, -3.321, -2.861, -2.661, -2.491,
-2.297, -2.373, -2.348, -2.216, -2.569, -2.676), SiteName = "Well..3737 7D Flaxmere", Measurement = "Depth From Land Surface", Units = "m", InterpolationMethod = "Quasi-continuous", DataType = "SimpleTimeSeries", TSType = "StdSeries", class = "zoo", index = structure(c(1515061200L,
1517484600L, 1519901100L, 1522761900L, 1525177200L, 1528199400L,
1530619800L, 1533209100L, 1535978400L, 1538994000L, 1541071500L,
1544693700L), class = c("POSIXct", "POSIXt"), tzone = "UTC")),
structure(c(4.30654362318781, 3.08465060629183, 3.69719825206464,
4.22951094416319, 4.74166852727183, 5.25868509480613, 5.37266948414152,
5.24168682648358, 5.09669530682964, 4.71066298287734, 5.05269565318106,
4.74566920516198), SiteName = "Well...222 Comminutor Stn", Measurement = "Depth From Land Surface", Units = "m", InterpolationMethod = "Quasi-continuous", DataType = "SimpleTimeSeries", TSType = "StdSeries", class = "zoo", index = structure(c(1515139200L,
1517491200L, 1519898400L, 1522762800L, 1525179600L, 1528186800L,
1530528900L, 1533199500L, 1535962200L, 1539082200L, 1541160300L,
1544786400L), class = c("POSIXct", "POSIXt"), tzone = "UTC")))
这是我迄今为止尝试过的方法,它接近于工作 - 除了我没有列名
test1 <- data.frame(setNames(do.call(cbind, unname(z)), names(z)))
我希望输出看起来像这样。
head(test1)
Date/Time Well...222 Comminutor Stn Well..3737 7D Flaxmere
2018-01-04 10:20:00 -3.221 NA
2018-01-05 08:00:00 NA 4.306544
2018-02-01 11:30:00 -3.601 NA
2018-02-01 13:20:00 NA 3.084651
2018-03-01 10:00:00 NA 3.697198
2018-03-01 10:45:00 -3.321 NA
但目前看起来像这样
X1 X2
2018-01-04 10:20:00 -3.221 NA
2018-01-05 08:00:00 NA 4.306544
2018-02-01 11:30:00 -3.601 NA
2018-02-01 13:20:00 NA 3.084651
2018-03-01 10:00:00 NA 3.697198
2018-03-01 10:45:00 -3.321 NA
这个怎么样
library(zoo)
Reduce(function(x, y) merge(x, y, all = T), lapply(z, function(x)
cbind(`Date/Time` = index(x), setNames(data.frame(x), attr(x, "SiteName")))))
# Date/Time Well..3737 7D Flaxmere Well...222 Comminutor Stn
#1 2018-01-04 10:20:00 -3.221 NA
#2 2018-01-05 08:00:00 NA 4.306544
#3 2018-02-01 11:30:00 -3.601 NA
#4 2018-02-01 13:20:00 NA 3.084651
#5 2018-03-01 10:00:00 NA 3.697198
#6 2018-03-01 10:45:00 -3.321 NA
#7 2018-04-03 13:25:00 -2.861 NA
#8 2018-04-03 13:40:00 NA 4.229511
#9 2018-05-01 12:20:00 -2.661 NA
#10 2018-05-01 13:00:00 NA 4.741669
#11 2018-06-05 08:20:00 NA 5.258685
#12 2018-06-05 11:50:00 -2.491 NA
#13 2018-07-02 10:55:00 NA 5.372669
#14 2018-07-03 12:10:00 -2.297 NA
#15 2018-08-02 08:45:00 NA 5.241687
#16 2018-08-02 11:25:00 -2.373 NA
#17 2018-09-03 08:10:00 NA 5.096695
#18 2018-09-03 12:40:00 -2.348 NA
#19 2018-10-08 10:20:00 -2.216 NA
#20 2018-10-09 10:50:00 NA 4.710663
#21 2018-11-01 11:25:00 -2.569 NA
#22 2018-11-02 12:05:00 NA 5.052696
#23 2018-12-13 09:35:00 -2.676 NA
#24 2018-12-14 11:20:00 NA 4.745669
这从 zoo
对象的 "SiteName"
属性中提取列名。
PS。包含 "special" 个字符的列名通常不是一个好主意,它们需要 "backticking"。