Cumany函数应用于NA值

时间:2018-01-15 16:21:48

标签: r dplyr

我有以下矢量:

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函数?

3 个答案:

答案 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