使用gsub在data.table中添加新列

时间:2015-05-13 15:02:18

标签: r data.table

很抱歉一个非常基本的问题,解决方案必须非常简单,但我无法找到它。

尝试使用gsub在data.table中添加新列,我收到了警告 " 参数'替换'长度> 1,只使用第一个元素",所有data.table行在新列中都有第一行的值。

以下是一个简化的案例:

dt[ , v3:=paste(v1,v2)]  

新列v3包含一个字符串,其中包含" 1"而不是" x"在所有行中。

使用其他功能,例如

$scope.findSelected = function (object, name){
            //var key = '';
            for (var i =0 ; i< object.length; i++){
               var children =object[i];
                var vName =children.Value.Name;
                if(vName=== name ){
                    var key=children.Value.Key;
                    break;


                }else {
                     key = $scope.findSelected(children.Children, name);
                }
            }
            return key;
        };

按预期工作。

我使用Rstudio v.0.98.1103,R v.3.1.2,data.table v.1.9.4

2 个答案:

答案 0 :(得分:12)

dt[, v3 := gsub("x", v1, v2), by = v1]  

答案 1 :(得分:5)

最简单的方法是使用具有矢量化参数的字符串处理包,例如stringi

library(stringi)
dt[, v3 := stri_replace_all_fixed(v2, "x", v1)][]
#    v1     v2     v3
# 1:  1    axb    a1b
# 2:  2   cxxd   c22d
# 3:  3 exfxgx e3f3g3

或者,您可以使用gsub函数制作自己的“矢量化”版Vectorize

vGsub <- Vectorize(gsub, vectorize.args = c("replacement", "x"))
dt[, v3 := vGsub("x", v1, v2)][]
#    v1     v2     v3
# 1:  1    axb    a1b
# 2:  2   cxxd   c22d
# 3:  3 exfxgx e3f3g3