如何在 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]
@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]