У меня есть data.table в следующем образце формата.
dt <- data.table(l = c("apple","ball","cat"),
m = c(1,2,3),
n = c("I ate apple", "I played ball", "cat ate pudding"))
Я хочу применить sub
к столбцу (n
) для каждой строки с шаблоном, исходящим из другого столбца (l
). Как бы я это сделал?
Результат, который я ищу,
l m n o
1: apple 1 I ate apple I ate
2: ball 2 I played ball I played
3: cat 3 cat ate pudding ate pudding
Я пытался использовать подход mapply(do.call, list(sub), ...)
с оператором присваивания в data.table, но аргументы sub
(шаблон, замена, строка) должны быть вложенным списком для do.call
, и я застрял в том, как правильно написать это.
dt[, Map(sub, l, '', n)]
? РЕДАКТИРОВАТЬ: это даст мне именованный вектор/список, поэтому мы действительно хотим обернуть возврат в списокdt[, o := (Map(sub, l, '', n))]
- person Shape   schedule 13.02.2017sub
у меня мог бы быть список отдельных функций. Однако ваш код работает в моем случае. Если вы хотите опубликовать это как ответ, пожалуйста, продолжайте. - person Naumz   schedule 13.02.2017dt[, mapply(sub, sprintf(" ?%s ?", l), "", n, USE.NAMES = FALSE)]
- решает проблему с именами, а также тот факт, что вокруг шаблонов могут быть пробелы (которые, по-видимому, OP также хочет удалить). - person Frank   schedule 13.02.2017dt[, o := trimws(sub(paste(l, collapse="|"), "", n))]
- person akrun   schedule 13.02.2017|
, вероятно, небезопасно. Даже не обязательно быть спецом, а вдруг он там другое слово ищет? - person Shape   schedule 13.02.2017collapse
был бы хорош, если бы мои реальные данные его поддерживали. - person Naumz   schedule 13.02.2017