2016-08-01 32 views
0

在我的代碼中,我計算了一個值,如果region [i] = region [i + 1]的和。如果區域彼此相鄰,我有興趣擴展此代碼以提供值的總和。識別相鄰對並求和followup

實施例:區域[1] = 「AXB」 區域[2] = 「CDB」

這將是相鄰的定義爲 「鄰近1」 和值應當概括:

值[I ] =值[I] +值[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 

回答

0

我們希望編寫一個函數,幫助我們確定region[i+1]是否與region[i]相同或「相鄰」。

首先,將Adjacent定義爲列表更容易,以便您可以遍歷它(而不是具有Adjacent1,Adjacent2等)。

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

我們寫檢查的功能,如果region[i+1]或者是相同或「鄰近」來region[i]:通過Adjacents列表

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

lapply迭代來標識包含region元組。因此findAdj同時返回region加上所有「相鄰」區域。

然後我們通過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)