根据列表dplyr

时间:2019-04-26 07:46:27

标签: r list dataframe dplyr

我正在尝试总结数据帧列表。这是一些测试数据

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)

我想生成一个数据帧列表,其中每个“ Dis”组的总和为“ adj”,然后为“ 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”,一个为“ B”。这是“ A”的预期输出:

    Dis total Nom
1     1     5   A
2     2    13   A

我该怎么做?

1 个答案:

答案 0 :(得分:3)

基本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))