确定相邻对并总结后续行动

时间:2016-08-01 21:55:13

标签: r

在我的代码中,如果region [i] = region [i + 1],我计算了一个值的总和。如果区域彼此相邻,我有兴趣扩展此代码以提供值的总和。

示例:region [1] =" AXB" region [2] =" CDB"

这将与定义相邻"相邻1"并且值应该相加:

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 2:length(df$region)) {
 if (region[i-1] == region[i]) {
    df$value[i-1] <- sum(value[c(i-1, i)])
    }
  }

我正在寻找这个作为我的输出:

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

1 个答案:

答案 0 :(得分:0)

我们希望编写一个函数,帮助我们确定region[i+1]是否与“#”相邻&#34;到region[i]

首先,将Adjacent定义为列表更容易,以便您可以迭代它(而不是Adjacent1Adjacent2等。)< / p>

Adjacents <- list(
    c("AXB", "CBD"), 
    c("DMN","FLR")
)

我们编写一个函数来检查region[i+1]是否与&#34;相邻&#34;到region[i]

findAdj <- function(region) {
    adj_list <- Adjacents[unlist(lapply(Adjacents, function(x) region %in% x))]
    unique(c(region, unlist(adj_list)))
}

lapply遍历Adjacents列表以标识包含region的元组。因此findAdj同时返回region本身以及所有&#34;相邻&#34;区域。

然后我们遍历df

df$valueNew <- NA
for (i in 1:(nrow(df)-1)) {
    if (df$region[i+1] %in% findAdj(df$region[i])) {
        df$valueNew[i] <- sum(df$value[i:(i+1)])
    }
}

获取

> df
   a region value valueNew
1 15    AXB    10       30
2  6    AXB    20       35
3 10    CBD    15       NA
4 50    FLR    30       NA

(不确定为什么输出的最后一行valueNew为30。)