【发布时间】:2022-01-13 09:57:36
【问题描述】:
我有一个包含 40 传感器的数据集,这些传感器的名称很奇怪(例如 A_B_Loc_1)。我需要将这些数据转换为长格式来绘制它们。我需要拆分名称,以便知道传感器名称(例如来自A_B_Loc_1, name=AB)和传感器位置(例如来自A_B_Loc_1, location=1)。
require(dplyr)
require(janitor)
require(tidyfast)
require(tidyr)
df<-data.frame(time=c("2021-02-27 22:06:20","2021-02-27 23:06:20"),A_Loc_1=c(500,600),A_Loc_2=c(500,600),A_B_Loc_1=c(500,600),A_B_Loc_2=c(500,600),B_Loc_1=c(500,600),B_3=c(500,600))
大约有 5000 万行,所以很慢:
编辑:哎哟!有些名称没有“Loc”(例如 B_3 是传感器 B,位置 3)。
#旋转它:
df %>%
tidyfast::dt_pivot_longer( #tidyfast package uses data.table instead of tidyr, so much faster
cols = -time,
names_to = "name",
values_to = "value"
) %>% drop_na()->df
#拆分名称
df %>%
separate(name,
into = c("sensor", "location"),
sep = "(?=[0-9])"
) %>%
mutate(sensor=janitor::make_clean_names(sensor, case = "big_camel"))
这可以加速吗? left join 有一个根据传感器名称添加列的查找表?
【问题讨论】:
-
make_clean_names在pivot_longer之后多次执行完全相同的操作。我会在pivot_longer之前这样做以加快速度
标签: r dplyr data.table