我正在尝试总结数据帧列表。这是一些测试数据
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
我该怎么做?
答案 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))