2015-09-21 6 views
2

Предоставлено ответ @ Яап от this stackoverflow questionКак выбрать первое значение, разделенное запятой, в столбце в data.table?

данных является чем-то вроде этого:

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)

ответ

2

Мы можем использовать 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] 
Смежные вопросы