Использование циклов с изменением в R для суммирования столбцов с частично совпадающими именами столбцов - PullRequest
3 голосов
/ 26 мая 2020
df <- data.frame(x_1_jr=c(1,2,3,4), x_2_jr=c(1,2,3,4), y_1_jr=c(4,3,2,1), y_2_jr=c(4,3,2,1)

  x_1_jr x_2_jr y_1_jr y_2_jr
1      1      1      4      4
2      2      2      3      3
3      3      3      2      2
4      4      4      1      1

Я пытаюсь сгенерировать новые переменные, которые представляют собой сумму x и y с тем же суффиксом имени столбца, т.е.

df <- df %>% mutate(z_1_jr= x_1_jr + y_1_jr)

  x_1_jr x_2_jr y_1_jr y_2_jr z_1_jr
1      1      1      4      4      5
2      2      2      3      3      5
3      3      3      2      2      5
4      4      4      1      1      5

Я мог бы записать это для каждой комбинации переменных, но я имеют большое количество переменных (> 50 для каждой группы x и y) и хотели бы использовать al oop ... однако я относительно новичок в R и не уверен, с чего начать!

Может кто поможет? Спасибо!

EDIT: для большей ясности набор данных содержит другие нечисловые c переменные. Есть> 700 столбцов (из большого обзора). x_1_jr представляет, например, количество особей мужского пола в возрасте 1 год, y_1_jr особей женского пола в возрасте 1 года. Я пытаюсь получить общее количество (мужчин и женщин в возрасте 1 года) для каждой возрастной группы.

А

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Вариант с base R

df[c("z_1_jr", "z_2_jr")] <- sapply(split.default(df, 
      sub("^[a-z]+_", "", names(df))), rowSums)
df
#  x_1_jr x_2_jr y_1_jr y_2_jr z_1_jr z_2_jr
#1      1      1      4      4      5      5
#2      2      2      3      3      5      5
#3      3      3      2      2      5      5
#4      4      4      1      1      5      5
0 голосов
/ 26 мая 2020

Один вариант dplyr и purrr может быть:

df %>%
 bind_cols(map_dfc(.x = unique(sub(".*?_", "_", names(df))),
                   ~ df %>%
                    transmute(!!paste0("z", .x) := rowSums(select(., ends_with(.x))))))

  x_1_jr x_2_jr y_1_jr y_2_jr z_1_jr z_2_jr
1      1      1      4      4      5      5
2      2      2      3      3      5      5
3      3      3      2      2      5      5
4      4      4      1      1      5      5
...