【问题标题】:Adding a column based on a list dplyr基于列表 dplyr 添加列
【发布时间】:2019-09-15 16:45:53
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

    标签: r list dataframe dplyr


    【解决方案1】:

    我们使用Map而不是lapply的基本R选项

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

    【讨论】:

    • 这正是我所需要的,谢谢。两者相比有什么好处吗?
    • 不客气。好吧,我更喜欢 base R 选项,因为您不需要任何外部包,但我在这里看不到任何其他好处。
    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多