我有一个简单的问题,我似乎无法在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
提前谢谢!
答案 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));
}
}`