使用 data.table 将长字符串解析为单独的行失败

问题描述 投票:0回答:2

我有一个数据集,其中包含一列,其中有单独的条目作为字符串(原始 Oracle 数据库中的 CLOB)。使用

tidyverse
方法,
strsplit
unnest
str_extract
效果很好,但原始数据子集非常有限。扩展数据集会导致我的计算机崩溃。

我尝试使用

data.table
方法,因为根据我的经验,data.table 在处理大型数据集时效果更好,并且这对于示例数据效果很好。但不幸的是,它在真实数据上失败了。请参阅下面的示例数据和代码。错误消息(我无法用示例数据重现)是:

[.data.table
(mondata_dt,,strsplit(CLOB,“ "), by = .(ID, : j 不会计算出每个组的相同列数

数据:

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)]
r data.table
2个回答
0
投票

下面首先确保您的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)]

0
投票

您可以尝试

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
© www.soinside.com 2019 - 2024. All rights reserved.