【发布时间】:2018-04-25 22:10:48
【问题描述】:
我有一个数字向量:
x <- c(0, 0, 0, 30, 60, 0, 0, 0, 0, 0, 10, 0, 0, 15, 45, 0, 0)
对于x中的每个元素i,我想做以下操作
- 如果
x[i] > 0,返回0 - 如果
x[i]之前的4个元素都是0,返回NA - 如果
x[i]之前的4个元素不是0,计算最后一个not-0元素和x[i]之间有多少个元素
我期望这个输出:
#> x
#[1] 0 0 0 30 60 0 0 0 0 0 10 0 0 15 45 0 0
#> x_out
#[1] NA NA NA 0 0 1 2 3 4 NA 0 1 2 0 0 1 2
请注意,当向量开头的可用元素少于 4 个时,该解决方案也应该有效(即条件 2 和 3 应该使用尽可能多的可用元素)。有人对此有解决方案吗?首选矢量化方法,因为矢量很长且数据集相当大。
【问题讨论】:
-
为什么前3个
NA?你说如果x[i]之前的所有4个元素都是0,返回NA(我假设x[i]是最后一个非零值) -
@Sotos vectorization 标签有什么问题?
-
请参阅我的问题的最后第四行:对于没有 4 个元素可用的位置,该函数应使用尽可能多的可用位置。所以第一个位置只有1个,第二个位置2个,第三个位置3个,从第4个位置开始4个位置。
-
@piptoma 好的,知道了
-
您对使用 Rcpp 有限制吗?因为,既然你还在处理这个问题,我认为你最好在 Rcpp 中编写一个简单的循环。
标签: r vector vectorization sequence