如果符合以下情况,我正在尝试计算价值总和:
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
答案 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