2016-08-02 4 views
3

Допустим, у меня есть строка следующим образомКак суммировать все экземпляры числа в строке в R

"The specimen is 34 x 1 x 5 mm and there is also another thing in there that is 22 x 4 x 1 mm and a further thing of 11 x 4 x 8 so this should be added together" 

Я хочу добавить кубическую мм каждой вещи вместе и место в отдельном поле в моем dataframe.

У меня есть регулярное выражение, чтобы сделать это, но я не знаю, как захватить каждый экземпляр, чтобы я мог добавить их вместе. Результат должен быть 1226 mm3

Чтобы захватить один экземпляр я использую:

chunky <- str_extract(EndoSubsetEMRSizes$NatureOfSpec, "\\d+\\s*x\\s*\\d+\\s*x\\s*\\d+") 

, но как захватить все в той же строке, так что они могут быть добавлены?

+1

Я получаю '610', делая' SUM (sapply (strsplit (regmatches (x, gregexpr ("\\ d + x \\ d + x \\ d +", x)) [[1]], "x", fixed = TRUE), function (x) prod (as.integer (x)))) '. Не знаете, как вы придумали '1226' –

+0

Я тоже получаю 610 ... способом более запутанным способом. – thepule

+0

Возможно, добавьте воспроизводимый пример с несколькими строками и желаемым выходом –

ответ

2

Другая идея с rollapply из zoo пакета,

library(zoo) 
library(stringr) 
sum(rollapply(as.numeric(str_extract_all(x, '[0-9]+')[[1]]), 3, by = 3, prod)) 
#[1] 610 

или применить его к колонке,

sapply(EndoSubsetEMRSizes$NatureOfSpec, function(x) 
      sum(rollapply(as.numeric(str_extract_all(x, '[0-9]+')[[1]]), 3, by = 3, prod)) 
+0

Вы не указали запятую или скобки из ответа столбца. Также должен x после str_extract_all быть EndoSubsetEMRSizes $ NatureOfSpec –

+0

Ничего не пропало ... Он должен работать, как есть – Sotos

+1

Хорошее использование 'rollapply' – akrun

0

Другой вариант

library(magrittr) 
matrix(na.exclude(as.numeric(strsplit(x,split = "\\s")[[1]])),byrow = T,ncol = 3) %>% apply(.,MARGIN = 1,FUN = prod) %>% sum() 

Я также получаю 610 как ответ.

Примечание: Warning message связано с преобразованием numeric.

Смежные вопросы