【发布时间】:2015-11-27 00:39:04
【问题描述】:
我有一个(10 万行)data.table mydata,其中一列如下所示:
library(data.table)
library(stringr)
mdata <- data.table(A = c("17M1I26M570M20S1M", "17M1I260M570M20S1M"))
我如何有效地 - 最好在 1 行代码中 - 提取 M 之前的所有数字(它们可以是不同的数字长),将它们转换为数字并找到它们的总和。
我已经设法通过 3 轮 sapply 函数完成了这项工作,并创建了一些我不需要的额外列:
mdata$c <- sapply(mydata[, A], function(x) unlist(str_extract_all(x, "\\d+M")))
mdata$c2 <-sapply(mydata[, c], function(x) unlist(as.numeric(gsub( "M", "",x))))
mdata$c3 <- sapply(mydata[,c2], function(x) sum(x))
有没有更简洁、计算更高效的方法来做到这一点?
【问题讨论】:
-
您没有提供可重现的示例,所以这里是评论中的伪代码答案:)
f = function(x) unlist(lapply(strsplit(x, "M"),[[,1L))然后dt[, .(col = f(col))],总和应该不是问题。 -
@jangorecki 编辑为可重现的示例。
标签: regex r data.table sapply