R 应用于NA值的Cumany函数
我有以下向量:R 应用于NA值的Cumany函数,r,dplyr,R,Dplyr,我有以下向量: x <- c(FALSE,FALSE,NA,TRUE,FALSE) 输出结果令我惊讶。我希望cumany函数可以如下工作 for(i in 1:length(x)){ print(any(x[1:i])) } [1] FALSE FALSE NA TRUE TRUE 因此,我希望输出如下 for(i in 1:length(x)){ print(any(x[1:i])) } [1] FALSE FALSE NA TRUE TRUE
x <- c(FALSE,FALSE,NA,TRUE,FALSE)
输出结果令我惊讶。我希望cumany函数可以如下工作
for(i in 1:length(x)){
print(any(x[1:i]))
}
[1] FALSE FALSE NA TRUE TRUE
因此,我希望输出如下
for(i in 1:length(x)){
print(any(x[1:i]))
}
[1] FALSE FALSE NA TRUE TRUE
当涉及到NA
值时,如何定义cumany()
函数
更新:
这是以前的
dplyr
版本中的一个错误,已被更正。如果您有相同的问题,只需更新软件包。一个选项是将NA
替换为FALSE,执行cumany
并使用|
获得原始NA填充位置
cumany(replace(x, is.na(x), FALSE))|x
#[1] FALSE FALSE NA TRUE TRUE
< >回答如何实现的问题,我们需要深入到C++中的实现。 如下所示,向量是用
NAs
初始化的,但是如果在NAs
out[i] = current || out[i - 1];
关于GitHub上的预期行为有一个简短的介绍
如果您的结果与预期不同,则很有可能需要更新dplyr
包
有关更多实现详细信息,请参见以下代码:
LogicalVector cumany(LogicalVector x) {
int n = x.length();
LogicalVector out(n, NA_LOGICAL);
int current = out[0] = x[0];
if (current == NA_LOGICAL) return out;
if (current == TRUE) {
std::fill(out.begin(), out.end(), TRUE);
return out;
}
for (int i = 1; i < n; i++) {
current = x[i];
if (current == NA_LOGICAL) break;
if (current == TRUE) {
std::fill(out.begin() + i, out.end(), TRUE);
break;
}
out[i] = current || out[i - 1];
}
return out;
}
LogicalVector cumany(LogicalVector x){
int n=x.length();
LogicalVector输出(n,NA_逻辑);
int电流=输出[0]=x[0];
if(current==NA_LOGICAL)返回;
如果(当前==真){
std::fill(fill.begin(),out.end(),TRUE);
返回;
}
对于(int i=1;i
要在所有基本R中重写它
Reduce(任意,x,累计=TRUE)|x
#>[1]假假假真
感谢您发布基础代码。但是,我仍然想知道cumany()
函数的逻辑。无论向量包含多少个na
,只要有一个TRUE
,any
函数应返回TRUE
。因此,我还希望从累积any
函数中,只要在计算的窗口中有一个TRUE
,就会返回TRUE
。此外,在dplyr中有关窗口函数的小插曲中,据说cumany()
是|
的累积版本NA | | TRUE
返回TRUE
。有趣的是,GitHub上有一个单元测试,它似乎期望基于NA | | TRUE
的行为。还有一个关于这个主题的简短介绍,得出了相同的结论。我不知道为什么我错过了out[I]=current | | out[I-1]代码>。我已经仔细检查了它,函数正常工作。尝试更新dplyr
package,可能就是这种情况。。。抱歉弄错了,我已经更新了答案。