如何在 data.table 的列中选择第一个逗号分隔值?

How to pick the first comma separated value in a column in data.table?

@Jaap 的回答来自

数据是这样的:

Name                                   Text idx             c_org
1:   John                      Text contains MIT   1               MIT
2: Sussan     some text with Stanford University   2          Stanford
3:   Bill He graduated from Yale, MIT, Stanford.   3 MIT,Yale,Stanford
4:   Bill                              some text   4                  

对于列 c_org,如果有多个值,如观察 3 MIT,Yale,Stanford,我会将第一个值 MIT 作为列值。结果应该是这样的:

Name                                   Text idx             NewOrg
1:   John                      Text contains MIT   1               MIT
2: Sussan     some text with Stanford University   2          Stanford
3:   Bill He graduated from Yale, MIT, Stanford.   3               MIT
4:   Bill                              some text   4        

(请注意,在c_org列中,有些字段有多个值,有些甚至为空。在预期输出中,如果只有一个值,则保留;如果有多个,保留第一个;如果为空,则保留为空。)

我试过了(但失败了):

DT[ , str_split(c_org, ",")[[1]][1]]

我想在一个字段中有多个值的会议数据是很常见的。如何在 data.table 中完成? (或者如果解决方案优于 data.table,则以其他方式)

我们可以使用 sub 来匹配模式 , 后跟一个或多个字符 (.*) 直到字符串的末尾 ($) 'c_org' 列并将其替换为 ''。输出可以赋值(:=)创建列'NewOrg',并将'c_org'赋值给NULL。

DT[, NewOrg := sub(',.*$', '', c_org)][,c_org:= NULL]
DT
#     Name                                   Text idx   NewOrg
#1:   John                      Text contains MIT   1      MIT
#2: Sussan     some text with Stanford University   2 Stanford
#3:   Bill He graduated from Yale, MIT, Stanford.   3      MIT
#4:   Bill                              some text   4         

或者 data.table v1.9.6+ 的另一个选项是 tstrsplit

DT[, NewOrg := tstrsplit(c_org, ',', fill='')[[1]]][, c_org:= NULL]