【问题标题】:Vectorized ifelse conundrum矢量化 ifelse 难题
【发布时间】:2016-04-15 15:27:14
【问题描述】:

我有两个数组“begin”和“end_a”,它们包含一些整数索引,除了“end_a”中的一些条目是NA

panelDataset 是一个包含数据的矩阵。我想取panelDataset对应begin和end_a的非NA条目的行。

我有这个以串行方式工作并且工作正常,但是当我尝试按如下方式对其进行矢量化时

switch_mu=ifelse(!is.na(end_a),mean(panelDataset[begin: end_a,4]),NA)

它给出一个错误:Error in begin:end_a : NA/NaN argument.

当我使用is.na(end_a) 分别检查NAs 的end_a 条目时,它确实将数组的正确条目显示为NA。所以,这不是问题。

我知道我错过了一些琐碎的事情。有什么想法吗?

【问题讨论】:

  • 这里发生了一些事情。您能否分享小的说明性数据以使其可重现? Data sharing via simulation or dput() is strongly preferred.
  • 您说 beginend_a 是数组,但您将它们用作标量,例如begin:end_a.
  • @ErnestA 天哪!那可能是错误。我有数组begin=c(1,2,3,4)end_a=c(10,15,NA,16),我想取第1 到10、2 到15 和4 到16 行的平均值。事实证明cbind 也不允许这种并行索引。

标签: r if-statement vectorization


【解决方案1】:

试试这个:

means <- apply(na.omit(cbind(begin, end_a)), 1,
      function(x) mean(panelDataset[x[1]:x[2], 4]))
replace(end_a, !is.na(end_a), means)

【讨论】:

  • 谢谢!这样可行。除此之外,我也想在最终结果中保留 NA 索引。例如,在我上面给出的示例中,我希望它返回一个大小为 4 的数组,其中第三个条目为 NA。您的解决方案省略了 NA,因此输出大小为 3 的向量。如果您可以在答案中解决这个问题,我会接受您的答案。
  • apply(cbind(begin, end_a), 1, function(x) if(is.na(x[2]) NA else mean(panelDataset[x[1]:x[2]]))
  • @BladeRunner 我更改了答案以生成与索引数组长度相同的向量。
  • @ErnestA 我想知道是否有一种矢量化的方式来进行就地替换,例如在上面的示例中,如果我们不想将输出分配给means,而是将其分配给@ 987654324@。这样做的明显循环方式有效,但似乎无法找到一种矢量化方式。 (假设我们只是乘以-1 而不是mean,这样尺寸保持不变)有什么想法吗?非常感谢任何帮助。
  • @BladeRunner 嗯a[b] &lt;- c 是向量化操作,只要b 是向量或数组。在这种情况下,b 需要是与panelDataset 大小相同的逻辑矩阵(对于大型矩阵来说效率低下)或 2 列索引数组。我认为您会从阅读 R 手册中的索引部分中受益,因为 R 中的索引与 Python 完全不同,尽管它们看起来很相似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多