我有一个数据集,其中包含一列,其中有单独的条目作为字符串(原始 Oracle 数据库中的 CLOB)。使用
tidyverse
方法,strsplit
、unnest
和 str_extract
效果很好,但原始数据子集非常有限。扩展数据集会导致我的计算机崩溃。
我尝试使用
data.table
方法,因为根据我的经验,data.table 在处理大型数据集时效果更好,并且这对于示例数据效果很好。但不幸的是,它在真实数据上失败了。请参阅下面的示例数据和代码。错误消息(我无法用示例数据重现)是:
(mondata_dt,,strsplit(CLOB,“ "), by = .(ID, : j 不会计算出每个组的相同列数[.data.table
数据:
library(tidyverse); library(data.table)
ID <- c(1,2)
DEVICE <- c(50,50)
METHOD <- c(12,12)
CLOB <- c("[02.01.2024 07:39:30]144,00\r\n[02.01.2024 07:41:30]146,00\r\n[02.01.2024 07:44:00]142,00\r\n[02.01.2024 07:49:00]167,00\r\n",
"[02.01.2024 09:06:14]105,00\r\n[02.01.2024 09:07:44]107,00\r\n[02.01.2024 09:09:44]71,00\r\n[02.01.2024 09:11:44]86,00\r\n")
df <- data_frame(ID, DEVICE, METHOD, CLOB)
TIDYVERSE 方法:
df <- df %>% mutate(Extr=strsplit(CLOB, "\r\n")) %>% unnest(Extr) %>% select(-CLOB)
df <- df %>% mutate(DTTM=str_extract(Extr, "\\d{2}.\\d{2}.\\d{4} \\d{2}:\\d{2}:\\d{2}"), VALUE=str_extract(Extr, "](.*)", group = 1))
数据表方法
dt <- as.data.table(df)
dt <- dt[, strsplit(CLOB, "\r\n"), by = .(ID, DEVICE, METHOD)]
dt <- dt[, DTTM:=str_extract(V1, "\\d{2}.\\d{2}.\\d{4} \\d{2}:\\d{2}:\\d{2}")]
dt <- dt[, VALUE:=str_extract(V1, "](.*)", group = 1)]
下面首先确保您的ID号唯一,然后重新分配。然后 (1) 调用 strsplit 将结果分配给与数据表长度相等的列表对象,并且 (2) 根据您的要求取消嵌套这些值。
dt <- as.data.table(df)
dt[,
ID:=.I]
dt[,
CLOB:=strsplit(CLOB, "\r\n")]
dt <- dt[,
.(V1=unlist(CLOB,recursive=FALSE)),
by = .(ID, DEVICE, METHOD)]
dt[, DTTM:=str_extract(V1, "\\d{2}.\\d{2}.\\d{4} \\d{2}:\\d{2}:\\d{2}")]
dt[, VALUE:=str_extract(V1, "](.*)", group = 1)]
您可以尝试
reframe
和 dplyr
df %>%
reframe(Extr = unlist(strsplit(CLOB, "\r\n")),
DTTM = str_extract(Extr, "\\d{2}.\\d{2}.\\d{4} \\d{2}:\\d{2}:\\d{2}"),
VALUE=str_extract(Extr, "](.*)", group = 1), .by = c(ID, DEVICE, METHOD)) %>%
select(-Extr)
# A tibble: 8 × 5
ID DEVICE METHOD DTTM VALUE
<dbl> <dbl> <dbl> <chr> <chr>
1 1 50 12 02.01.2024 07:39:30 144,00
2 1 50 12 02.01.2024 07:41:30 146,00
3 1 50 12 02.01.2024 07:44:00 142,00
4 1 50 12 02.01.2024 07:49:00 167,00
5 2 50 12 02.01.2024 09:06:14 105,00
6 2 50 12 02.01.2024 09:07:44 107,00
7 2 50 12 02.01.2024 09:09:44 71,00
8 2 50 12 02.01.2024 09:11:44 86,00