我有一个包含9个相同数据的list waterlevels,其中包含关于测压器、K01到K09的信息。每个数据文件包含96860行,所有行都有13个变量,除了一个有21个变量(这一列中的额外列不重要)之外。
$K01
dateandtime seconds pressure_kPa temperature_.C baropressure_kpa barocompensation_kpa waterlevel_cm lengthcables_cm
1 2019-11-05 00:00:00 0 111.482 13.261 98.854 12.628 128.7697 490
2 2019-11-05 00:15:00 900 111.506 13.261 98.883 12.623 128.7188 490
3 2019-11-05 00:30:00 1800 111.511 13.261 98.872 12.639 128.8819 490
4 2019-11-05 00:45:00 2700 111.544 13.261 98.898 12.646 128.9533 490
5 2019-11-05 01:00:00 3600 111.536 13.313 98.913 12.623 128.7188 490 我想使用下面的代码将这个列表融化为一个仅包含、一个变量、和dateandtime变量的数据文件:
waterlevels_all <- melt(waterlevels, id.vars=c("dateandtime", "barocompensation_kpa"))
但是,结果的dataframe waterlevels_all有10364020个观测值,而只有这个df应该只有871740行(9*96860)。因此,它必须有三个变量:dateandtime、barocompensation_kpa和L1是对应的dataframe的名称(=测压器的名称- K01 to K09)。
> head(waterlevels_all)
dateandtime barocompensation_kpa variable value L1
1 2019-11-05 00:00:00 17.55336 seconds 0 K01
2 2019-11-05 00:15:00 17.55489 seconds 900 K01
3 2019-11-05 00:30:00 17.55703 seconds 1800 K01
4 2019-11-05 00:45:00 17.55347 seconds 2700 K01
5 2019-11-05 01:00:00 17.55540 seconds 3600 K01
6 2019-11-05 01:15:00 17.56050 seconds 4500 K01这怎麽可能?我怎么才能得到正确的数据?
发布于 2022-09-08 16:10:09
下面是使用tidyverse -循环在list上使用imap的一些选项,对感兴趣的列进行select,并使用list元素名称(.y)创建新列'L1‘。
library(dplyr)
library(purrr)
imap_dfr(waterlevels, ~ .x %>%
select(dateandtime, barocompensation_kpa) %>%
mutate(L1 = .y))或者使用map,只需select列并使用.id创建新列(_dfr通过重新绑定list元素返回单个数据集)
map_dfr(waterlevels, ~ .x %>%
select(dateandtime, barocompensation_kpa), .id = "L1")发布于 2022-09-08 15:55:53
尝试lapply和后续的Map和rbind。
lapply(lst, subset, select=c('dateandtime', 'barocompensation_kpa')) |>
Map(f=`[<-`, 'L1', value=names(lst)) |>
# c(make.row.names=FALSE) |> ## optional, to reset row names
do.call(what=rbind)
# dateandtime barocompensation_kpa L1
# K01.1 0 0 K01
# K01.2 0 0 K01
# K01.3 0 0 K01
# K02.1 0 0 K02
# K02.2 0 0 K02
# K02.3 0 0 K02
# K03.1 0 0 K03
# K03.2 0 0 K03
# K03.3 0 0 K03数据:
lst <- list(K01 = structure(list(dateandtime = c(0, 0, 0), seconds = c(0,
0, 0), pressure_kPa = c(0, 0, 0), temperature_.C = c(0, 0, 0),
baropressure_kpa = c(0, 0, 0), barocompensation_kpa = c(0,
0, 0), waterlevel_cm = c(0, 0, 0), lengthcables_cm = c(0,
0, 0)), row.names = c(NA, -3L), class = "data.frame"), K02 = structure(list(
dateandtime = c(0, 0, 0), seconds = c(0, 0, 0), pressure_kPa = c(0,
0, 0), temperature_.C = c(0, 0, 0), baropressure_kpa = c(0,
0, 0), barocompensation_kpa = c(0, 0, 0), waterlevel_cm = c(0,
0, 0), lengthcables_cm = c(0, 0, 0)), row.names = c(NA, -3L
), class = "data.frame"), K03 = structure(list(dateandtime = c(0,
0, 0), seconds = c(0, 0, 0), pressure_kPa = c(0, 0, 0), temperature_.C = c(0,
0, 0), baropressure_kpa = c(0, 0, 0), barocompensation_kpa = c(0,
0, 0), waterlevel_cm = c(0, 0, 0), lengthcables_cm = c(0, 0,
0), X9 = c(0, 0, 0), X10 = c(0, 0, 0), X11 = c(0, 0, 0), X12 = c(0,
0, 0), X13 = c(0, 0, 0), X14 = c(0, 0, 0), X15 = c(0, 0, 0),
X16 = c(0, 0, 0), X17 = c(0, 0, 0), X18 = c(0, 0, 0), X19 = c(0,
0, 0), X20 = c(0, 0, 0), X21 = c(0, 0, 0)), class = "data.frame", row.names = c(NA,
-3L)))https://stackoverflow.com/questions/73651504
复制相似问题