试图在R

时间:2016-12-09 01:30:13

标签: r

我的目标是计算向量从正值变为负值的次数,反之亦然。我会将其保存在'更改'例如。 E.g。

randomvector <- c(0, 3, 2, -1, -4, -1, 2, 5, 8, 6, 3, 1, -2, -1, 1, 0, 3)

在这种情况下,&#39;更改&#39;将是4,(2后跟-1,-1后跟2,1,后跟-2,-1后跟1)

这是我到目前为止所做的。

Point1 <- c(1:16)
Point2 <- c(2:17)

Number = 0
  if(randomvector[Point1] >0 & randomvector[Point2]) {
      Number = Number + 1
}
Number

基本上,我的代码是这样说的:如果randomvector的第一个值是&gt; 0,并且randomvector的第二个值是&lt; 0,则将数字1添加到&#39;数字&#39;。 &#39;编号&#39;用作计数来跟踪发生这种情况的次数。向量Point1和Point 2从1和2开始,分别转到16和17,因为我希望if语句在向量randomvector中的每个连续数字对中移动。

这就是我得到的:

Warning messages:
1: In if (randomvector[Point1] > 0 & randomvector[Point2]) { :
the condition has length > 1 and only the first element will be used

> Number
[1] 0

我理解0的输出,因为代码在遇到if语句中的错误后没有运行。我也理解错误,即if语句不适用于矢量化对象。我不确定如何攻击这个,或者我是否使用最好的方法。如果我没有,请使用完全错误的方法随时告诉我。

谢谢!

3 个答案:

答案 0 :(得分:5)

一种方法是测试连续值sum(abs(diff(sign(randomvector))) == 2) # 4 的绝对差值何时为2

sign(randomvector)
# [1]  0  1  1 -1 -1 -1  1  1  1  1  1  1 -1 -1  1  0  1

因为

diff(sign(randomvector))
# [1]  1  0 -2  0  0  2  0  0  0  0  0 -2  0  2 -1  1

A few minor tweaks and help from Dave resolved my issue :D 

<!DOCTYPE html>
        <html>
          <head>
            <title><%= title %></title>
            <link rel='stylesheet' href='/stylesheets/style.css' />
          </head>
          <body>
            <h1><%= title %></h1>
            <p>Welcome to <%=orderSearch.objectId %></p>
          </body>
        </html>

    var express = require('express');
    var router = express.Router();
    var mongodb = require('mongodb');
    var mongoClient = mongodb.MongoClient;
    var url = 'mongodb://localhost:27017/WishList';


    //http://localhost:3000/buyersearch?buyerID=2447


    //buyerIDSearch
    router.get('/', function (req, res) {
        var buyerID = req.query.buyerID;

        if (!buyerID || !parseInt(buyerID)) {
            res.render('error', {message: "Please enter an Buyer Identification Number", error: {status: "", stack: ""}});
        } else {
            mongoClient.connect(url, function (err, db) {
                if (err) {
                    res.render('error', {message: "Failed to connect", error: {status: "", stack: ""}});
                } else {
                    var WishListDB = db.collection('orders');
                    WishListDB.find({"buyerID": parseInt(buyerID)}).toArray(function (err, result) {
                        if (err || !result || result.length == 0) {
                            res.render('error', {
                                message: "No order found with that ID number",
                                error: {status: "", stack: ""}
                            });
                        } else {
                            res.render('buyerSearch', {
                                buyerSearch: result[0],
                                buyerID: result[0]
                            })
                        }

                    });

                }

            })
        }

    });

    module.exports = router;

答案 1 :(得分:3)

randomvector <- c(0, 3, 2, -1, -4, -1, 2, 5, 8, 6, 3, 1, -2, -1, 1, 0, 3)
TestVec = randomvector[-1] * randomvector[-length(randomvector)]
which(TestVec <0) +1

答案 2 :(得分:1)

另一种方法是使用rle。忽略0个数字,找出值变化的次数。

length(rle(sign(randomvector[randomvector!=0]))$lengths) - 1
#[1] 4