R:替换数据帧中字符串的有效方法(表)

时间:2016-02-15 13:18:48

标签: r string grep

以下是该问题的代码:

# > system.time({
#   +   df$a <- factor(df$a)
#   +   levels(df$a) <- renamer(levels(df$a))
#   +   df$a <- as.character(df$a)
#   + })
# user  system elapsed 
# 1.25    0.14    1.42 

问题:有一个大型数据集需要以时间有效的方式替换大多数值。我的代码可以解决这个问题。但是,我真的可以使用更快的解决方案。

请注意,有重复出现的值。而且......(有时会发生这种情况)我写这个问题时,我可能想出了解决方案,其中包括将列转换为因子并替换级别值。但我还是决定留下这个问题,因为其他人可能需要帮助解决这个问题,或者有一些聪明的替代解决方案。

这是基准的因素解决方案:

inline long limit(long amt,long lim)
{
    if(unlikely(amt < -lim))
        return -lim;
    else 
    {   
        if(unlikely(amt > lim))
            return lim;
        return amt;
      }
}

1 个答案:

答案 0 :(得分:2)

我建议创建一个简单的查找表并使用优秀的stringi::stri_detect_fixed函数(给我~X100加速)

library(data.table)
library(stringi)

Lookup <- c("ac", "gf", "er", "hy", "nh", "oi", "nu", "vf", "cd", "po")
Rename <- substring(paste(rep(letters[1:10], each = 3), collapse = ""), 
                    seq(1, 30 ,3), seq(3, 30, 3))


system.time(setDT(df)[, Result := Rename[stri_detect_fixed(a, Lookup)], by = a])
# user  system elapsed 
# 0.10    0.05    0.14