替代的

安库尔

我在R中使用以下代码:

df$max_col<- sapply(df$col, function(x) ifelse(x == "", 0, strsplit(as.character(x), "", perl = TRUE)[[1]] %>% as.numeric %>% max(na.rm = T)))

这段代码基本上会打乱“ 123456”之类的字符串,并将其转换为数字并从中返回最大值。现在,我有一列满是这样的字符串,并且这段代码可以正常运行,直到数据量变小为止。但是,当数据大小为2500万行(我目前正在处理)时,此代码将变得非常慢。此代码是否有其他替代方法,可以通过该替代方法从存储在新列中的字符串中获取最大值?

生活

一个基于我上面的评论的答案(但是我已经修改了代码,以便它可以实际工作):

x <- c("123", "224", "221", "1912323", "445")
apply(sapply(1:9, function(p) grepl(p, x)), 1, function(k) max(which(k)))
# the above will work if 0 is never the largest  number in any cell

更通用的版本:

doit <- function(x) apply(sapply(0:9, function(p) grepl(p, x)), 1, function(k) max(which(k)))-1
x <- c("123", "224", "221", "1912323", "445", "000")
doit(x)
# [1] 3 4 2 9 5 0

这比使用strsplit的原始代码快3倍...但是我敢肯定还有改进的余地。嗯...实际上,我将strsplit再次尝试

doit3 <- function(.) sapply(strsplit(.,""), max)
doit3(x)
# [1] "3" "4" "2" "9" "5" "0"

这比我以前的方法快5倍。因此,问题不在其他组件sapply或存在strsplit于其他组件中。如果需要将其转换为数字,则将其添加as.numeric到外层,这不会花费太多时间:

doit4 <- function(.) as.numeric(sapply(strsplit(.,""), max))
> doit4(x)
# [1] 3 4 2 9 5 0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章