首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中相同数据与一个数据的熔融列表

R中相同数据与一个数据的熔融列表
EN

Stack Overflow用户
提问于 2022-09-08 15:21:07
回答 2查看 38关注 0票数 3

我有一个包含9个相同数据的list waterlevels,其中包含关于测压器、K01到K09的信息。每个数据文件包含96860行,所有行都有13个变量,除了一个有21个变量(这一列中的额外列不重要)之外。

代码语言:javascript
运行
复制
$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)。因此,它必须有三个变量:dateandtimebarocompensation_kpaL1是对应的dataframe的名称(=测压器的名称- K01 to K09)。

代码语言:javascript
运行
复制
> 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

这怎麽可能?我怎么才能得到正确的数据?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-08 16:10:09

下面是使用tidyverse -循环在list上使用imap的一些选项,对感兴趣的列进行select,并使用list元素名称(.y)创建新列'L1‘。

代码语言:javascript
运行
复制
library(dplyr)
library(purrr)
imap_dfr(waterlevels, ~ .x %>% 
   select(dateandtime, barocompensation_kpa) %>%
   mutate(L1 = .y))

或者使用map,只需select列并使用.id创建新列(_dfr通过重新绑定list元素返回单个数据集)

代码语言:javascript
运行
复制
map_dfr(waterlevels, ~ .x %>% 
     select(dateandtime, barocompensation_kpa), .id = "L1")
票数 3
EN

Stack Overflow用户

发布于 2022-09-08 15:55:53

尝试lapply和后续的Maprbind

代码语言:javascript
运行
复制
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

数据:

代码语言:javascript
运行
复制
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)))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73651504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档