Другая возможность tidyverse
может быть:
df %>%
gather(var, val, -c(id, pos, store)) %>%
arrange(id, var) %>%
group_by(id) %>%
mutate(temp = cumsum(ifelse(parse_number(var) == pos, 1, 0) == 1),
val = ifelse(temp == 1,
val - (val[min(which(temp == 1))] - val[max(which(temp == 0))]), val)) %>%
select(-temp) %>%
spread(var, val)
id store pos v1 v2 v3 v4 v5
<int> <chr> <int> <int> <int> <int> <int> <int>
1 1 A 3 5 5 5 5 5
2 2 B 4 1 1 1 1 2
. Во-первых, он преобразует данные из широкоформатного формата в длинный, исключая переменные «id», «pos» и «store».Во-вторых, он упорядочивает данные по «id» и «var» (который является ключом) и группирует по «id».В-третьих, он проверяет (используя переменную «temp»), равно ли число в ключе (т. Е. Число в именах переменных от «v1» до «v5») равно числу в «pos».Если это так, он присваивает 1, а затем выполняет кумулятивную сумму около 1, таким образом присваивая также всем последующим строкам значение 1. Далее, если значение в «temp» равно 1, оно вычитает значение в последней строке с 0 из значенияв первой строке с 1, а затем вычтите это из всех строк с 1. Наконец, он возвращает данные в их первоначальную форму.