基于这个问题:Split text string in a data.table columns,我想知道是否有一种有效的方法可以根据行的内容有条件地分割文本字符串。
假设我有下表:
Comments Eaten
001 Testing my computer No
0026 Testing my fridge No
Testing my car Yes
我希望如此:
ID Comments Eaten
001 Testing my computer No
0026 Testing my fridge No
NA Testing my car Yes
NA为空。
这在data.table中是否可行?
评论应该有一个ID,但由于这是可选的,我只想提取ID,当且仅当评论以数字开头时。
答案 0 :(得分:6)
这可以使用tidyr
的{{1}}函数来完成,该函数允许您指定正则表达式模式:
extract
如果希望将提取的列转换为更合理的类型,可以添加参数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
。
仅使用base R和data.table的另一个选项是
convert = TRUE
虽然在这种情况下,tidyr语法似乎对我来说更容易一些。也许有一种方法可以使用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
]
函数和一个奇特的外观正则表达式。