【问题标题】:Reference forward and behind vector element in calculation在计算中参考前向和后向向量元素
【发布时间】:2017-12-10 10:30:23
【问题描述】:

我有这个向量:

vector <- c(NA,1,rep(NA,24),1,NA,NA)
 [1] NA  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA  1 NA NA

基本上我想做的是:

在 excel 中,命令是这样的: 计算点 = E40

=IF(B41=1,1,+E39+1)

在 R 中会是这样的:

ifelse([+1 forward] == 1,1,[-1 behind]+1)

它基本上是一个计数器,当遇到 1 时会重置为 1。

这是所需的输出:

> output
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25  1  2  3  4 

如果我们从元素 1,vector[1] 开始,那么我们将使用 ifelse([+1 forward],1,1 语句查看vector[2]

在这种情况下,这是真的,所以我们放置 1... 接下来我们向上移动一个元素位置。现在我们在位置 2..vector[2]。该语句现在正在寻找 ifelse([+1 forward],1,1 in vector[3],如果它不是 1,则它采用 vector[1] 并添加 +1。接下来的事情......在位置 @ 987654330@,该语句现在正在寻找一个 ifelse([+1 forward],1,1 in vector[4],如果它不是 1,则它采用向量 [2] 并添加一个 +1.. 所以一个正在运行的计数器...最终我们遇到另一个 1,然后计数器将重置为 1...我们再次开始计数...直到下一个 1。

也许有意义?

这是它在 excel 中的工作原理

这是我尝试过的:

vector <- c(NA,1,rep(NA,24),1,NA,NA)
i=1
for( i in 1:length(vector)) {
  start <- ifelse(vector[i + 1]==1,1,vector[i - 1]+1)
}
start

【问题讨论】:

  • dplyr::leaddplyr::lag?
  • 如果 i lead(vector) 第一个元素消失并在最后加上 NA,当我需要第一个元素保持在位置 1 以便将其添加到正在进行的计算中时。跨度>
  • 对不起,我无法真正按照您的示例进行操作?如果您可以更明确地说明您想要的结果,我可能会理解为什么 lead/lag 不适合您
  • 只是为了让我理解正确,如果输入向量的第二个位置的值是NA或者不是1的值,结果还是一样吗?
  • 第 1 位会影响输出。如果有 1,计数器将在其位置放置 1,如果向量元素 == 1,1,否则前一个数字 +1... 所以如果它是 NA,NA,NA,NA,1,NA.. . 它将是 1,2,3,1,2(它的 1,2,3 在位置 4 时作为 ifelse,它在位置 5 中寻找 ifelse 1=1)

标签: r


【解决方案1】:

这会重现您的预期输出。

x <- vector;
for (i in 1:length(x))
    if (x[i + 1] == 1 & !is.na(x[i + 1])) x[i] = 1 else x[i] = x[i - 1] + 1;
x;
# [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#[26]  1  2  3  4

附言。 vector 是 R 中变量的一个非常糟糕的名称。


样本数据

vector <- c(NA,1,rep(NA,24),1,NA,NA);

【讨论】:

  • 查看上面想要的输出和excel示例
【解决方案2】:

如果我理解正确,您可以这样做:

library(dplyr)
x = c(NA, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, NA, 1, 1, 0, 2, 5, 6, 1, 3)
y = (lead(x)!=1|is.na(lead(x)))
res = cumsum(y)-cummax((cumsum(y)-1)*!y)
[1] 1 2 3 4 5 6 1 2 3 4 5 6 1 1 2 3 4 5 1 2 3

这是对question 的答案之一的构建。

【讨论】:

  • 近了!以我的确切示例...它放置一个 1,1,2,3,4,5,6 等...当它应该是 1,2,3,4,5 时,从一开始就...它非常接近尽管!我正在尝试使用 for 循环设置 i+1 和 i-1 来表示向前和向后
【解决方案3】:

过了一会儿,用for循环弄明白了

i=1
start <- NULL
for( i in 1:length(vector)) {
  start[i] <- ifelse(vector[i + 1]==2,1,start[i - 1]+1)
}
start

数据:

 vector <- c(1,2,rep(1,24),2,1,1)

【讨论】:

  • 您没有看到我更新的解决方案吗?另外,开头不需要i=1;更好的做法是为 start 预先分配内存,例如start &lt;- vectorstart &lt;- rep(0, length(vector)).
猜你喜欢
  • 2014-02-27
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 2021-07-01
  • 2016-12-30
相关资源
最近更新 更多