rollapply na.rm = TRUE给出0值而不是NA' s

时间:2016-09-20 21:03:54

标签: r na rollapply na.rm

我有一个简单的问题,我似乎无法在google,stackoverflow或stackexchange上找到答案。我目前正在使用rollapply的示例来查找包含NA的某些值的总和。例如:

 z <- zoo(c(NA, NA, NA, NA,2, 3, 4, 5, NA))
 rollapply(z, 3, sum, na.rm = TRUE, align = "right")

输出:

  3  4  5  6  7  8  9 
  0  0  2  5  9 12  9 

这看起来不错,但有两次连续有3个NA。求和功能将NA交换为0&#39; s。不幸的是,由于0是一个有意义的值,因此我不会使用我要使用的数据。有没有办法再次用NA替换0&#39;

我正在寻找如下输出:

  3   4   5  6  7  8  9 
  NA  NA  2  5  9 12  9 

提前谢谢!

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作(即使不是很好)

require(zoo)
z <- zoo(c(NA, NA, NA, NA,2, 3, 4, 5, NA))
tmp <- rollapply(z, 3, sum, na.rm = TRUE, align = "right")

tmp[is.na(z)[-2:-1] & tmp == 0] <- NA
tmp

因此,只要NA为na,就会指定z,并NA生成rollapply

给你:

> tmp
 3  4  5  6  7  8  9 
NA NA  2  5  9 12  9 

答案 1 :(得分:0)

以下是两种方法:

1)请注意,rollapply不是0,而sum(x, na.rm = TRUE)给出0。函数sum(x, na.rm = TRUE)并不是真正的需要这里。

相反,提供一个以所需方式工作的sum版本,即当输入完全为NA时返回NA,否则返回sum(x, na.rm = TRUE)。 / p>

sum_na <- function(x) if (all(is.na(x))) NA else sum(x, na.rm = TRUE)
rollapplyr(z, 3, sum_na)

2)或者,使用您的代码然后通过将NA输入为NA的所有位置替换为zz <- rollapplyr(z, 3, sum, na.rm = TRUE) zz[rollapply(is.na(z), 3, all)] <- NA 来修复它:

> zz
 3  4  5  6  7  8  9 
NA NA  2  5  9 12  9 

,并提供:

if (isset($_POST['submit']))
{
PWMatch();
}
function PWMatch()
{
$PW = $_POST['password'];
$CPW = $_POST['confirmPW'];
global $Mash;


if ($PW == $CPW)
{
    define("Max_Length", 6);

    $salt = md5(uniqid(rand(), true));
    $chips = substr($salt,0, Max_Length);
    $Mash = hash("sha256", $CPW.$chips);

    NewUser();
}   
else 
{
    echo "Passwords do not match";
}
}

function NewUser()
{       
    global $conn;

    $count = "SELECT COUNT(*) FROM users WHERE user_Email = '$_POST[email]'";

    if (mysqli_connect_errno($conn))
    {
        echo "connection error .....";
    }

    if ($result = mysqli_query($conn, $count))
    {
        while ($row = mysqli_fetch_assoc($result))
        {
            if($row['COUNT(*)'] == "1")
            {
                echo "Email already in use.";
            }
            else 
            {
                SignUp();
            }
        }
    }
}

function SignUp()
{
    global $conn;
    global $Mash;       

   $query = "INSERT INTO users (user_Name, user_Email, user_Password, user_Joined) VALUES ('$_POST[name]', '$_POST[email]', '$Mash', now())";

   if (mysqli_connect_errno($conn))
   {
        echo "Connection Error..... ";
   }
   if (mysqli_query($conn, $query))
   {
    echo "completed";
   }
   else 
   {
    echo (mysqli_error($conn));
   }
}`