检查内容是否属于相邻对并进行求和

时间:2016-07-27 06:55:11

标签: r

如果符合以下情况,我正在尝试计算价值总和:

1。)region [i] = region [i + 1]

示例:

region [1] =“AXB” region [2] =“AXB”

因此,例如在这种情况下它应该返回

   value[i] = value[i] + value[i+1]

2。)如果一个不成立,代码应检查region [i] = region [i + 1]是否是Adjacent1,Adjacent2等定义的邻近区域。

实施例: region [1] =“AXB” region [2] =“CDB”

这将是相邻的,值应该相加:

   value[i] = value[i] + value[i+1]

请注意,这仅供我个人使用,不适用于硬件分配。 到目前为止,我已经编写了以下代码,但不确定从何处开始。

a = c(15,6,10,50)
region = c("AXB","AXB","CBD","FLR")
value = c(10,20,15,30)

df = data.frame(a,region,value)

Adjacent1 = c("AXB", "CBD")
Adjacent2 = c("DMN','FLR")

for(i in 1:length(df$region))
 {
     if (region[i] == region[i+1]) {
      df$value[i]  = value[i] + value[i+1]
      }
 }

给了我一个错误:

Error in if (region[i] == region[i + 1]) { : 
  missing value where TRUE/FALSE needed

预期输出:

a    region value leadregion  valueNew
15    AXB    10   AXB           30
6     AXB    20   CBD           45
10    CBD    15                 
50    FLR    30   FLR           30                

2 个答案:

答案 0 :(得分:1)

您正在对region[5]的不存在值进行子集化。你有几个选择。

正如评论部分的绅士所提到的,你可以从2.位置开始,并使用减法来索引元素,这是

的内容。
for (i in 2:length(df$region)) {
  if (region[i-1] == region[i]) {
    df$value[i-1] <- sum(value[c(i-1, i)])
  }
}

另一种选择是在向量结束之前停止1个元素,现在可以容纳i+1不返回NA

for (i in 1:(length(df$region) - 1)) {
  if (region[i] == region[i+1]) {
    df$value[i] <- sum(value[c(i, i+1)])
  }
}

答案 1 :(得分:0)

使用dplyr包中的超前滞后:

library(dplyr)

df %>% 
  mutate(
    region = as.character(region),
    regionLead = lead(region, default = ""),
    valueLead = lead(value, default = 0),
    valueNew = if_else(region == regionLead, 
                      value + valueLead, value))

#    a region value regionLead valueLead valueNew
# 1 15    AXB    10        AXB        20       30
# 2  6    AXB    20        CBD        15       20
# 3 10    CBD    15        FLR        30       15
# 4 50    FLR    30                    0       30