Вычитание столбцов с одинаковым префиксом на основе разных суффиксных циклов заканчивается на - PullRequest
0 голосов
/ 15 марта 2019

У меня есть большой набор данных, который организован следующим образом

Date.       A_H.   B_H.   C_H.   D_H.   A_L.   B_L.   C_L.   D_L
1/1/18.      4.    6.       7.      6.   3.     2     2.     4
1/2/18       5.    7.       3.      5.   6.     3     1.     4

Я хочу добавить столбцы, которые являются High - Low для каждой соответствующей буквы. Итак, я хочу, чтобы в этом примере было еще 4 столбца, по одному на каждую букву, которая вычитает соответствующую букву L из H. Однако мой истинный фрейм данных содержит около 150 пар, поэтому я хочу, чтобы не ручной способ сопоставления и вычитания префикса основывался на суффикс.

Я перепробовал много подходов, включая цикл for с mutate, mapping и метод с использованием sub select и redu. а мой фрейм данных

Aa <- names(a) %>%
    sub(“_\\d+$”, “”, .) %>%
    unique 
Aa %>% 
    map(~a %>%
        select(matches(.x))%>%
        reduce(‘-‘)) %>%
        set_names(paste0(“HL_”, Aa)) %>%
    bind_cols(a, .) 

Но я получаю ошибку «совпадения - неиспользованный аргумент»

Я тоже пытаюсь

Aa <- map(c(“A”, “B”, “C”, “D”), ~a %>%
                      mutate(!!as.name(paste0(.x, “_HL”)) := !!as.name(paste0(.x, “_H”)) - !!as.name(paste0(.x, “_L”)))) %>%
    reduce(left_join)

Но я получаю ошибку! As.name (paste0 (.x, «_L»)): неверный тип аргумента

я тоже попробую Aa <- c («A», «B», «C», «D») </p>

 for(i in 1:length(Aa)){
     Aaa <- a %>% mutate(a, !!as.name(paste0(Aa[i], “_HL”)) := !!as.name(paste0(Aa[i], “_H”)) - !!as.name(paste0(Aa[i], “_L”)))}

Но с этим я получаю «LHS должен быть ошибкой имени или строки»

Любой совет, что я пытаюсь сделать? Заранее спасибо!

1 Ответ

0 голосов
/ 15 марта 2019

Одна 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.

...