Одна tidyverse
возможность может быть:
bind_cols(df %>%
gather(var, val, -matches("(_L)|(Date)")) %>%
select(Date., var, val),
df %>%
gather(var, val, -matches("(_H)|(Date)")) %>%
select(Date., var, val)) %>%
mutate(res1 = paste0(var, "_", var1),
res2 = val-val1) %>%
select(Date., res1, res2) %>%
spread(res1, res2) %>%
left_join(df, by = c("Date." = "Date."))
Date. A_H._A_L. B_H._B_L. C_H._C_L. D_H._D_L. A_H. B_H. C_H. D_H. A_L. B_L. C_L. D_L.
1 1/1/18. 1 4 5 2 4 6 7 6 3 2 2 4
2 1/2/18 -1 4 2 1 5 7 3 5 6 3 1 4
Сначала он отдельно преобразует столбцы _H
и _L
из широкого формата в длинный. На втором этапе он объединяет два столбца. После этого шага он создает имена новых переменных путем объединения имен столбцов _H
и _L
и вычитает столбцы _L
из столбцов _H
. Наконец, он преобразует новые переменные с желаемыми результатами в исходный широкоформатный формат, а затем соединяет его с исходным df на основе «Дата».
Или:
df %>%
gather(var, val, -Date.) %>%
mutate(temp = gsub("_.*$", "", var)) %>%
arrange(Date., temp) %>%
group_by(temp = gl(length(var)/2, 2)) %>%
mutate(res1 = paste(var, collapse = "_"),
res2 = val - lead(val)) %>%
na.omit() %>%
ungroup() %>%
select(Date., res1, res2) %>%
spread(res1, res2) %>%
left_join(df, by = c("Date." = "Date."))
В этом случае он, во-первых, преобразует данные из широкого в длинный формат, исключая «Дата». колонка. Во-вторых, он берет символы до _
из имен переменных и упорядочивает данные в соответствии с «Дата». и это. В-третьих, для каждых двух строк он назначает уровень фактора и группы по нему. В-четвертых, он объединяет имена переменных и выполняет вычитание. Наконец, он возвращает данные в исходный широкоформатный формат и объединяет их с исходным df.
Или с базой R вы можете попробовать что-то вроде:
res <- df[, grepl("_H", colnames(df))] - df[, grepl("_L", colnames(df))]
colnames(res) <- paste(colnames(df[, grepl("_H", colnames(df))]),
colnames(df[, grepl("_L", colnames(df))]), sep = "_")
cbind(df, res)
Date. A_H. B_H. C_H. D_H. A_L. B_L. C_L. D_L A_H._A_L. B_H._B_L. C_H._C_L. D_H._D_L
1 1/1/18. 4 6 7 6 3 2 2 4 1 4 5 2
2 1/2/18 5 7 3 5 6 3 1 4 -1 4 2 1
Здесь он, во-первых, определяет столбцы, которые содержат _H
и _L
. Во-вторых, он вычитает столбцы _L
из столбцов _H
. В-третьих, он объединяет имена столбцов _H
и _L
столбцов и присваивает его результатам в качестве имен столбцов. Наконец, он объединяет результаты со старым df.