我有一个命名向量(比如n),其名称为1到25000的连续整数,以及与之关联的值,以及另一个较小的向量(比如m),类似于" n",21399元素,名称从1开始,到25000结尾。
我想将命名元素添加到矢量" m"缺少名称并为其指定值0。
我这样做是通过创建两个数据框,其名称和值为两列,然后进行左连接,但有没有更好的方法呢?
一个小得多的例子:
> n=c("1"=3,"2"=5,"3"=2,"4"=9,"5"=8)
> n
1 2 3 4 5
3 5 2 9 8
> m=c("1"=9,"2"=7,"5"=2)
> m
1 2 5
9 7 2
我想要我的决赛" m"是:
> m
1 2 3 4 5
9 7 0 0 2
我做的是:
> x=data.frame("p"=names(n),n)
> y=data.frame("p"=names(m),m)
> join(x,y,by="p")
p n m
1 1 3 9
2 2 5 7
3 3 2 0
4 4 9 0
5 5 8 2
答案 0 :(得分:2)
几次尝试:
NA
使用setNames( m[match(names(n),names(m))], names(n) )
# 1 2 3 4 5
# 9 7 NA NA 2
而不是0:
app.get('/:shopId/:locationId/announcement/*',function(req,res,next){
async.waterfall([
function (done) {
var resultsObj = '';
var httpTransport = 'http://';
if (config.secure && config.secure.ssl === true) {
httpTransport = 'https://';
}
var url = httpTransport + req.headers.host+'/api/offer/getbyid/'+req.params[0];
request.get(url, function (err, res, body) {
resultsObj = JSON.parse(body);
done(err, resultsObj);
});
},
function (resultsObj, done) {
var httpTransport = 'http://';
if (config.secure && config.secure.ssl === true) {
httpTransport = 'https://';
}
var url = httpTransport + req.headers.host+'/api/shops/'+req.params.shopId+'/'+req.params.locationId;
request.get(url, function (err, res, body) {
var resultsObjNew='';
resultsObjNew = JSON.parse(body);
done(err, resultsObjNew,resultsObj);
});
},
function (resultsObjNew,resultsObj, done) {
res.render('modules/core/server/views/announcement', {
title: resultsObj[0].title,
imageUrl : resultsObj[0].imageURL,
desc : resultsObj[0].desc,
link:resultsObj[0].redirectLink,
logoLink: resultsObjNew.logoLink,
backgroundImage:resultsObjNew.backgroundImage
});
}
]);
});
答案 1 :(得分:0)
我们可以使用这个
x=data.frame("p"=names(n),n)
y=data.frame("p"=names(m),m)
merged = merge (x , y, by ="p", all.x = TRUE)
并取代" NA"零,我们有
merged[is.na(merged)] <- 0
输出
p n m
1 1 3 9
2 2 5 7
3 3 2 0
4 4 9 0
5 5 8 2