2015-06-03 1 views
2

У меня есть таблица данных, как этотВставить несколько элементов из списка векторов

 ID   Name 
1: 2760925 01_HOOFD_010 
2: 2760925 01_HOOFD_015 
3: 2771451 01_HOOFD_010 
4: 2771451 01_HOOFD_190_2 
5: 2771451 01_HOOFD_030_2 
6: 2771451 08_AWB45_020_2 
7: 2771451 08_AWB45_040 
8: 2771451 01_HOOFD_065_2 

Для поля «Имя», я хочу, чтобы иметь часть после второго подчеркиванием в отдельной колонке data.table. В настоящее время я использую strplit с «_», как знак, но моя проблема заключается в том, что некоторые записи имеют 3 элемента, а также некоторые другие 4. Мое текущее решение

DT$code_3<-DT[,.(lapply(strsplit(Name,"_"),"[",3:4)),][,.(lapply(V1,function(x) paste(na.omit(x),collapse="_"))),] 

, но я сомневаюсь, что это самый факт/кратчайший путь ... У вас есть идеи? Спасибо

> dput(DT) 
structure(list(ID = c(2760925L, 2760925L, 2771451L, 2771451L, 
2771451L, 2771451L, 2771451L, 2771451L), Name = c("01_HOOFD_010", 
"01_HOOFD_015", "01_HOOFD_010", "01_HOOFD_190_2", "01_HOOFD_030_2", 
"08_AWB45_020_2", "08_AWB45_040", "01_HOOFD_065_2")), .Names = c("ID", 
"Name"), row.names = c(NA, -8L), class = c("data.table", "data.frame" 
), .internal.selfref = <pointer: 0x103819178>) 

ответ

1
x <-structure(list(ID = c(2760925L, 2760925L, 2771451L, 2771451L, 
2771451L, 2771451L, 2771451L, 2771451L), Name = c("01_HOOFD_010", 
"01_HOOFD_015", "01_HOOFD_010", "01_HOOFD_190_2", "01_HOOFD_030_2", 
"08_AWB45_020_2", "08_AWB45_040", "01_HOOFD_065_2")), .Names = c("ID", 
"Name"), row.names = c(NA, -8L), class = c("data.table", "data.frame" 
)) 

x$two <- gsub("(.*?)_(.*?)_(.*?)" , "" , x$Name) 
+0

Спасибо @Anthony, быстрый и лаконичный понравился я спросил ... – User800701

+2

Другая версия 'суб ('([^ _] + _) {2}', '', х $ Name) 'или синтаксис' data.table' будет 'x [, two: = sub ('([^ _] + _) {2}', '', Name)]' – akrun