Мы можем использовать apply
с MARGIN = 1
(построчно). Сохраните номер столбца, где для этой строки встречается Change_Month
(inds
). Возьмите подстроку Change_Dt
и убедитесь, что значение больше или равно 15, и на основании этого sum
значения разделите на две части и добавьте в качестве новых столбцов.
col <- 4 #Column number from where the months start
df[c("N_OPN", "V_OPN")] <- t(apply(df, 1, function(x) {
inds <- grep(x[["Change_Month"]], names(x))
if (as.numeric(substr(x["Change_Dt"], 1, 2)) > 15)
c(sum(as.numeric(x[col:pmax(col, inds - 1)])),
sum(as.numeric(x[inds:ncol(df)])))
else
c(sum(as.numeric(x[col:inds])),
sum(as.numeric(x[pmin(ncol(df), inds + 1):ncol(df)])))
}))
df[c(1:3, 16, 17)]
# Adv_Code Change_Dt Change_Month N_OPN V_OPN
#1 A201 12/04/2018 April 0 1
#2 A198 27/07/2018 August 3 7
#3 S1212 10/11/2018 November 11 0
данные
df <- structure(list(Adv_Code = structure(c(2L, 1L, 3L), .Label =
c("A198",
"A201", "S1212"), class = "factor"), Change_Dt = structure(c(2L,
3L, 1L), .Label = c("10/11/2018", "12/04/2018", "27/07/2018"), class =
"factor"),
Change_Month = structure(1:3, .Label = c("April", "August",
"November"), class = "factor"), April_OPN = c(0L, 2L, 0L),
May_OPN = c(0L, 0L, 3L), June_OPN = c(1L, 0L, 4L), July_OPN = c(0L,
1L, 0L), August_OPN = c(0L, 2L, 0L), September_OPN = c(0L,
0L, 3L), October_OPN = c(0L, 5L, 0L), November_OPN = c(0L,
0L, 1L), December_OPN = c(0L, 0L, 0L), January_OPN = c(0L,
0L, 0L), February_OPN = c(0L, 0L, 0L), March_OPN = c(0L,
0L, 0L)), class = "data.frame", row.names = c(NA, -3L))