У меня есть фрейм данных со столбцами: Slot, Period, SortNumber и Value. Фактически, этот фрейм данных был создан для чтения данных из некоторых баз данных доступа, и я делаю некоторую работу над ним, сравнивая строки и т. Д. Итак, я также использую пакеты RODBC и stringr. Эта часть кода прекрасно работает в R и Power BI, поэтому я не воспроизводил здесь. Это пример моего последнего фрейма данных:
dfAccess <- data.frame(Slot = c("X1", "X2", "X3", "X1", "X3","X1", "X2", "X3", "X2", "X3"),
Period = c(1,1,1,2,2,1,1,1,2,2),
SortNumber = c(1, 1, 1, 1,1,2,2,2,2,2),
Value = c(9,5,7,9,5,6,4,8,2,1))
Этот фрейм данных не имеет слота X2 для периода 2 в SortNumber 1 и слота X1 для периода 2 в SortNumber 2 (он может пропустить любую строку). Визуально это означает:
Slot Period SortNumber Value
=======================================
X1 1 1 9
X2 1 1 5
X3 1 1 7
X1 2 1 9
X3 2 1 5
X1 1 2 6
X2 1 2 4
X3 1 2 8
X2 2 2 2
X3 2 2 1
Я хочу создать новый столбец (DiffValue), который вычисляет разницу между значением и значением, где SortNumer = 1 (сгруппированы по слоту и периоду)
Проблема в том, что Slot и Period не обязательно имеют одинаковые значения для каждого SortNumber. В этом случае я хотел бы использовать 0 в качестве значения по умолчанию и рассчитать разницу для каждой строки.
Я использую dplyr
и, когда данные согласованы, работает нормально. В противном случае я получаю ошибку: "Column DiffValue must be length 1 (the group size), not 0"
dfAccess <-dfAccess %>%
group_by(Slot, Period) %>%
mutate(DiffValue = Value - Value[SortNumber == 1] )
Используя эти данные, я хотел бы видеть следующее:
Slot Period SortNumber Value DiffValue
=========================================================
X1 1 1 9 0
X2 1 1 5 0
X3 1 1 7 0
X1 2 1 9 0
X3 2 1 5 0
X1 1 2 6 -3
X2 1 2 4 -1
X3 1 2 8 1
X2 2 2 2 -2 ("0" - 2)
X3 2 2 1 -4
Это способ сделать это?
РЕДАКТИРОВАТЬ: Я изменил части исходного сообщения, потому что Синь Нгуен обнаружил проблему в данных, но у меня все еще есть проблемы для расчета разницы.
Спасибо!