很抱歉一个非常基本的问题,解决方案必须非常简单,但我无法找到它。
尝试使用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
答案 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