根据R中的特定条件求和值
我的df结构如下:根据R中的特定条件求和值,r,sum,aggregate,R,Sum,Aggregate,我的df结构如下: Ateco. Numb. Reg 10 223 A 11 332 A 12 343 A 10 223 B 11 332 B 12 343 B 29 414 B 30 434 B 31 444 B 32 464 B 我想得到另一个df,其中numb是我选择的Ateco值的总和 Ateco. Numb.
Ateco. Numb. Reg
10 223 A
11 332 A
12 343 A
10 223 B
11 332 B
12 343 B
29 414 B
30 434 B
31 444 B
32 464 B
我想得到另一个df,其中numb是我选择的Ateco值的总和
Ateco. Numb. Reg
10_11_12 898 A
10_11_12 898 B
29 414 B
30 434 B
31 444 B
32 464 B
我该怎么做?根据更新的输入示例,按“Reg”分组,并在“Ateco”中存在值10到12,获取“Numb”的总和,然后粘贴“Ateco”,元素,如果需要,取消分组并删除“grp”
library(tidyverse)
df %>%
group_by(Reg, grp = Ateco. %in% 10:12) %>%
summarise(Numb. = sum(Numb.),
Ateco. = paste(Ateco., collapse="_")) %>%
ungroup %>%
select(-grp)
# A tibble: 3 x 3
# Reg Numb. Ateco.
# <chr> <int> <chr>
#1 A 898 10_11_12
#2 B 414 29
#3 B 898 10_11_12
使现代化
基于新数据集
df2 %>%
group_by(Ateco. = case_when(Ateco. %in% 10:12 ~ '10_11_12',
TRUE ~ as.character(Ateco.)), Reg) %>%
summarise(Numb. = sum(Numb.))
# A tibble: 6 x 3
# Groups: Ateco. [?]
# Ateco. Reg Numb.
# <chr> <chr> <int>
#1 10_11_12 A 898
#2 10_11_12 B 898
#3 29 B 414
#4 30 B 434
#5 31 B 444
#6 32 B 464
数据
试试看你的公司。,df,FUN=粘贴,折叠=uuu或使用dplyr df%>%group\u byNumb.,Reg%>%summarieteco.=pasteAteco.,collapse=uu或data.table setDTdf[,.Ateco.=pasteAteco.,collapse=u,by=.Numb.,Reg]是的,但我必须声明我要聚合的Ateco值在您的示例中,10、11、12是唯一的值,因此它应该自动获得pastedyou是正确的。我做了一些改变,是否有其他条件指定一组中的10:12?如果有多个不同于10、11、12的值,这会给我带来问题。我更新了输入数据。dfIt聚合了我想要聚合的值,但也聚合了所有其他值。@Silvia更新了帖子
df2 %>%
group_by(Ateco. = case_when(Ateco. %in% 10:12 ~ '10_11_12',
TRUE ~ as.character(Ateco.)), Reg) %>%
summarise(Numb. = sum(Numb.))
# A tibble: 6 x 3
# Groups: Ateco. [?]
# Ateco. Reg Numb.
# <chr> <chr> <int>
#1 10_11_12 A 898
#2 10_11_12 B 898
#3 29 B 414
#4 30 B 434
#5 31 B 444
#6 32 B 464
df <- structure(list(Ateco. = c(10L, 11L, 12L, 10L, 11L, 12L, 29L),
Numb. = c(223L, 332L, 343L, 223L, 332L, 343L, 414L), Reg = c("A",
"A", "A", "B", "B", "B", "B")), class = "data.frame", row.names = c(NA,
-7L))
df2 <- structure(list(Ateco. = c(10L, 11L, 12L, 10L, 11L, 12L, 29L,
30L, 31L, 32L), Numb. = c(223L, 332L, 343L, 223L, 332L, 343L,
414L, 434L, 444L, 464L), Reg = c("A", "A", "A", "B", "B", "B",
"B", "B", "B", "B")), class = "data.frame", row.names = c(NA,
-10L))