R中的data.table中的条件字符串拆分

Sno*_*ake 3 regex r data.table

基于这个问题:在data.table列中拆分文本字符串,我想知道是否有一种有效的方法可以根据行的内容有条件地拆分文本字符串.

假设我有下表:

Comments                  Eaten
001 Testing my computer   No
0026 Testing my fridge    No
Testing my car            Yes
Run Code Online (Sandbox Code Playgroud)

我会这样:

ID   Comments             Eaten
001  Testing my computer  No
0026 Testing my fridge    No
NA   Testing my car       Yes
Run Code Online (Sandbox Code Playgroud)

NA是空的.

这在data.table中是否可行?

注释应该有一个ID,但由于这是可选的,我只想提取ID,当且仅当注释以数字开头时.

tal*_*lat 6

这可以使用允许您指定正则表达式模式tidyrextract函数来完成:

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
Run Code Online (Sandbox Code Playgroud)

convert = TRUE如果希望将提取的列转换为更合理的类型,则可以添加参数.


另一个只使用base R和data.table的选项就是

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
]
Run Code Online (Sandbox Code Playgroud)

虽然在这种情况下,tidyr语法似乎对我来说更容易一些.也许有一种方法使用data.table的tstrsplit功能,带有花哨的外观正则表达式.