在我的代码中,如果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
答案 0 :(得分:0)
我们希望编写一个函数,帮助我们确定region[i+1]
是否与“#”相邻&#34;到region[i]
。
首先,将Adjacent
定义为列表更容易,以便您可以迭代它(而不是Adjacent1
,Adjacent2
等。)< / 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。)