我有以下矢量:
x <- c(FALSE,FALSE,NA,TRUE,FALSE)
我使用cumany()
函数查看第一个元素的窗口中是否有至少一个TRUE
值,直到向量中的每个元素或其他元素为止窗口中的单词[1,1:长度(x)]。
library(dplyr)
cumany(x)
[1] FALSE FALSE NA NA NA
输出令我惊讶。我希望cumany函数能够如下工作
for(i in 1:length(x)){
print(any(x[1:i]))
}
因此我希望输出如下
[1] FALSE FALSE NA TRUE TRUE
在cumany()
值时,如何定义NA
函数?
答案 0 :(得分:2)
要回答有关如何实施的问题,我们需要深入研究实现,这是在C ++中完成的。
正如您在下面看到的那样,向量是使用NAs
进行初始化的,但是如果在TRUE
之前满足至少一个NAs
值,则会传输一个至关重要的代码行。
out[i] = current || out[i - 1];
关于GitHub的预期行为有一个简短的discussion。
如果您的结果与预期不同,则您很有可能需要更新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;
}
答案 1 :(得分:1)
一个选项是replace
NA
,为cumany
,|
并使用cumany(replace(x, is.na(x), FALSE))|x
#[1] FALSE FALSE NA TRUE TRUE
获取原始NA填充位置
template
答案 2 :(得分:0)
在所有基础R中重写它,
Reduce(any, x, accumulate = TRUE) | x
#> [1] FALSE FALSE NA TRUE TRUE