Conditional string split in data.table in R

data.table, r, regex

Solution

This could be done using `tidyr`'s `extract` function which allows you to specify a regex pattern:

tidyr::extract(dt, Comments, c("ID", "Comments"), regex = "^(\\d+)?\\s?(.*)$")
#     ID            Comments Eaten
#1:  001 Testing my computer    No
#2: 0026   Testing my fridge    No
#3:   NA      Testing my car   Yes

You can add the argument `convert = TRUE` if you want the extracted columns to be converted to a more sensible type.

Another option using only base R and data.table would be

dt[grepl("^\\d+", Comments),                     # check if start with ID (subset)
   `:=`(ID = sub("^(\\d+).*", "\\1",Comments),   # extract ID from comments
        Comments = sub("^(\\d+)", "",Comments))  # delete ID from Comments
]

Though in this case the tidyr syntax seems a little easier to me. There may also be a way using data.table's `tstrsplit` function with a fancy lookaround regex.

Problem

Based on this question: Split text string in a data.table columns, I was wondering whether there is an efficient method to split the text string conditionally based on the contents of the row. Suppose I have the following table: ``` Comments Eaten 001 Testing my computer No 0026 Testing my fridge No Testing my car Yes ``` and I would to have this: ``` ID Comments Eaten 001 Testing my computer No 0026 Testing my fridge No NA Testing my car Yes ``` Where NA is empty. Is this possible in data.table? The comment should have an ID, but since this is optional, I only want to extract the ID's if and only if the comment starts with a number.

Original source

Related problems