Добавление столбца на основе списка dplyr - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь составить список данных.Вот некоторые тестовые данные

noms <- list('A', 'B')

A_data <- data.frame('Dis' = c(1, 1, 2, 2),
                     'adj' = c(3, 2, 6, 7))
B_data <- data.frame('Dis' = c(1, 1, 2, 2),
                     'adj' = c(2, 6, 3, 6))

frames <- list(A_data, B_data)

Я хочу составить список фреймов данных, где 'adj' суммируется для каждой группы 'Dis', а затем добавить столбец для соответствующего имени из 'noms', чтобыЗатем я могу объединить кадры данных вместе, чтобы сформировать единый кадр данных в будущем.

Пока у меня есть это:

totals <- setNames(lapply(frames, function (x)
  x %>%
    dplyr::group_by(Dis) %>%
    dplyr::summarise(total = sum(adj)))
  ,paste0(unlist(noms)))

Но я могу понять, как добавить столбец с соответствующим именем.Я знаю, что мне нужно использовать функцию mutate примерно так:

totals <- setNames(lapply(frames, function (x)
  x %>%
    dplyr::group_by(Dis) %>%
    dplyr::summarise(total = sum(adj)) %>%
    dplyr::mutate(nom = )
  ,paste0(unlist(noms)))

, но я не могу понять, как добавить правильное имя.

Ожидаемым выводом будет списокдва кадра данных, один для «А» и один для «В».Вот ожидаемый результат для 'A':

    Dis total Nom
1     1     5   A
2     2    13   A

Как мне это сделать?

1 Ответ

3 голосов
/ 26 апреля 2019

Базовый вариант R, где мы используем Map вместо lapply

out <- Map(function(x, y) {
  transform(aggregate(adj ~ Dis, data = x, sum), Nom = y)
}, x = frames, y = noms)
out
#[[1]]
#  Dis adj Nom
#1   1   5   A
#2   2  13   A

#[[2]]
#  Dis adj Nom
#1   1   8   B
#2   2   9   B

Та же идея с tidyverse функциями

library(purrr); library(dplyr)
map2(.x = frames, .y = noms, ~ .x %>% 
       group_by(Dis) %>% 
       summarise(adj = sum(adj)) %>% 
       mutate(Nom = .y))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...